oracle apex文件上传

时间:2012-10-04 13:49:56

标签: oracle-apex

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

2 个答案:

答案 0 :(得分:5)

文件浏览项将始终上传到BLOB列。如果不在指定的表中,它将转到wwv_flow_filesapex_application_files),这是备用选项。这应该不是一个破坏者,因为在完成BLOB的处理后你可以轻松地清理表格。

  • 确定文件最终需要的位置
  • 确保您拥有必要的权限! (读,写,......)
  • 在数据库中创建一个引用此目录的目录对象 位置:CREATE DIRECTORY statement documentation
  • 确保您对此物品有必要的补助(阅读, 写,...)
  • 创建一个将BLOB写入文件的过程。这方面的一个例子 技术是here (dba-oracle.com)。简而言之,那会做什么 是:

    • 在文件系统上打开一个文件(需要一个目录,一个目录由你的目录对象的名称引用) 早些时候创建!)

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

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

    • 拿blob
    • 读了一段
    • 将该文章写入文件系统
    • 重复最后2个步骤,直到达到blob的结尾(除非BLOB足够小,可以一次写入)
    • 将文件浏览项设置为上传到wwv_flow_files
    • 关闭文件(完成)
  • 然后,您可以更改该程序,以便像BLOB中一样IN 参数。
  • 在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 forumsOTN PL/SQL forums

答案 1 :(得分: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;