【问题标题】:oracle apex file uploadoracle 顶点文件上传
【发布时间】:2012-09-25 13:51:39
【问题描述】:

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

【问题讨论】:

    标签: oracle-apex


    【解决方案1】:
    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;
    

    【讨论】:

      【解决方案2】:

      文件浏览项将始终上传到BLOB 列。如果不在指定的表中,它将转到 wwv_flow_files (apex_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

      【讨论】:

      • 感谢您提供如此详细的解释,尽管我已经按照您描述的方式进行了操作。问题是我想省略这些步骤(写入 BLOB 列 -> 提取到本地目录)。似乎用 APEX 是不可能的。
      • 不,据我所知不是。当一个文件被上传到服务器时,你不知何故需要它的句柄,而表中的一个 blob 就是用来做这个的。我想不出你跳过所有这些的方法。文件必须上传到服务器端。他们必须在那里处理。
      猜你喜欢
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 2020-05-28
      • 2021-04-01
      • 1970-01-01
      相关资源
      最近更新 更多