6

我想改变 APEX 上传文件的方式。我不希望文件作为 BLOB 进入数据库表。相反,我希望他们能够直接进入运行 apex 的机器上的 OS 目录。可能吗?如果是这样,我需要从什么开始?

4

2 回答 2

5

文件浏览项将始终上传到BLOB列。如果不在指定的表中,它将转到wwv_flow_files( apex_application_files),这是备用选项。不过,这不应该是一个破坏交易的因素,因为您可以在完成处理BLOB.

  • 确定文件需要结束的位置
  • 确保您拥有必要的权限!(读,写,...)
  • 在引用此位置的数据库中创建目录对象:CREATE DIRECTORY 语句文档
  • 确保您对该对象拥有必要的授权(读、写……)
  • 创建一个将 a 写入BLOB文件的过程。此技术的一个示例在此处 (dba-oracle.com)。简而言之,它将做的是:

    • 在文件系统上打开一个文件(需要一个目录,并且一个目录由您
      之前创建的目录对象的名称引用!)

      -- define output directory
      l_output := utl_file.fopen('DIR_TEMP', 'filename','wb', 32760);
      

      在这个示例代码中,创建的目录是DIR_TEMP对象

    • 拿走
    • 读一段
    • 将该部分写入文件系统
    • 重复最后 2 个步骤,直到到达 blob 的末尾(除非BLOB小到可以一次性写入)
    • 设置要上传到的文件浏览项wwv_flow_files
    • 关闭文件(完成)
  • 然后,您可以更改该过程以采用BLOBas inIN 参数。
  • 在 apex 中,创建一个提交后的 plsql 进程。您可以在那里调用文件写入过程,并为其提供存储的 blob。
  • 并清理上传表。

顶点过程示例:

DECLARE
   v_upl_blob BLOB;
BEGIN
   SELECT blob_content 
     INTO v_upl_blob
     FROM wwv_flow_files
    WHERE name = :Px_FILE_BROWSE_ITEM;

   my_file_write_procedure(v_upl_blob);

   DELETE FROM wwv_flow_files
    WHERE name = :Px_FILE_BROWSE_ITEM;
END;

对于更多文档,当然总是有 google,这里使用的所有对象的 oracle 文档,甚至是 oracle 论坛(例如OTN apex 论坛OTN PL/SQL 论坛

于 2012-10-05T07:59:06.190 回答
0
declare
  v_length number;
  v_id number;
begin
   select doc_size
   into v_length
   from   wwv_flow_files
   where  name = :P105_PIC;

if v_length > 20000 then
   delete from wwv_flow_files where name = :P105_PIC;
   commit;

    apex_error.add_error (
    p_message          => 'Cannot upload pictures bigger than 20kB!',
    p_display_location => apex_error.c_inline_in_notification );

end if;
exception
 when others then
    apex_error.add_error (
    p_message          => 'Cannot upload pictures!',
    p_display_location => apex_error.c_inline_in_notification );
end;
于 2015-09-28T18:32:44.747 回答