我正在使用一个带有BLOB列的表来存储用户的简历(它可以是word文档,pdf文件或任何其他二进制格式)。
现在在Oracle Apex 4.2中,当我在此表上创建表单时,我会自动获得一个浏览按钮,用于为BLOB列选择一个文件。我可以浏览文件并选择一个文件,然后按下另一个按钮(也自动提供)上传文件。现在,如果我在SQL Developer或Pl / SQL开发人员中看到此记录,我看到BLOB数据存在,我可以将其保存到我的磁盘,甚至可以直接从数据库中查看。这一切都很好!
但现在当我在同一个桌面上创建一个报告在Oracle APEX中,然后运行该报告时,它并没有给我任何查看或下载二进制文件的选项,相反,它只提供了文本&# 34; [不支持的数据类型]"在BLOB列空间中。我在Oracle APEX在线文档中看到,当我们运行具有BLOB列的报告时,APEX会自动提供下载按钮....但实际上它没有发生,我看不到在Oracle APEX中检索BLOB列数据的方法。有人可以帮帮我???
先谢谢。
答案 0 :(得分:6)
该解决方案也在Apex 4.2版本(具体地,4.2.5)上进行;特别感谢Oracle Corp在http://apex.oracle.com上托管我的测试实例。
以下是我使用的表的架构设计,其中包含BLOB类型的数据列。注意:这不是最终解决方案的设计;只需按照变化进行操作,这样您就可以了解我发现的APEX表单和报表创建向导的一些限制。
表:MY_DOC_STACK首次布局尝试
列DOC_FILE
是存储实际文档附件的BLOB类型。这是使用APEX应用程序向导创建的表单和报表的外观,该向导直接指向表:
将文档添加到BLOB类型字段
报告查询似乎如下所示:
以下是包含文档附件的更多记录的列表:
多个记录的示例报表输出
问题是在尝试下载放入BLOB字段的文件时:
图片中的细微内容,但是已识别的mime类型:Application/Octet-Stream
表示APEX表单已丢失了我刚刚上传的文件类型(Microsoft Word,docx) 。保存的文件只是一堆垃圾字符。尝试更改文件扩展名也无济于事。
尽管在向导完成后应用程序区域及其组件不能立即生效,但只有少量的小编辑可以使其进入工作状态。对表单元素PX_DOC_FILE
的仔细检查表明,BLOB表单元素需要一些关于附加到记录的文件的其他元信息:
blob字段表单输入项中缺少的内容:
- Mime Type
- 文件名
- 字符集
- BLOB上次更新(日期)列
醇>
我继续定义了其他列并将其添加到包含BLOB的表(MY_DOC_STACK),上传Apex表单和报告区域定义。
请注意,列名称(为简单起见)已与Blob表单元素DOC_FILE
的要求相同。
修订文件附件Apex表格
我最初认为必须聪明地预测Mime类型(msword,pdf,zip等)的所有可能值,但这是不必要的。同样,为字符类型和最后更新的列保留的其他字段。
重要提示: 您实际上可以跳过支持Blob元数据字段的表单输入。上传文档附件时会自动检测
MIME_TYPE
和CHARACTER_TYPE
等值。存储文档blob的Apex表单ITEM只需要存储此信息的列的名称。附加说明: 添加新列,展开表单和报告列引用后,您需要清除(或截断)现有表或重新加载每个文档附件是肯定的。您可以在第一次尝试时仍然使用上传,但是您需要自行验证确认。
修订的文档Blob上传报告
[所有者:AUDREY HEPBURN]:我用表格强制MIME_TYPE
到#34; Application / msword&#34 ;;虽然我上传的文件是" .docx"输入,通过Apex页面将其保存回本地客户端,作为" .doc"格式(旧的MS Word格式)。
[所有者:CHEVY CHASE]:这次没有输入MIME_TYPE
,并且Apex表单处理/操作在创建时将其添加到记录中:
应用/ vnd.openxmlformats-officedocument.wordprocessingml.document
这可能是Microsoft Office 2013
指定的格式。 FILE_NAME
值是用户定义的,并且显式添加了.docx扩展名。结果是下载文件提示用户默认使用我的客户端计算机上的正确应用程序打开文件:MS Word(版本2013)。
[所有者:CARRIE FISHER]:与测试用例(2)相同,但使用Adobe PDF(可移植文档格式)。除了MIME_TYPE
标识为application / pdf之外的相同行为;文件按预期打开。
更多讨论:
所有这些问题都来自Apex用于管理应用程序架构中的插入,更新和删除的通用DML API,很可能是Apex强化SQL的一部分注射攻击。 SQL客户端中使用的直接INSERT
和SELECT
语句与设置默认表单设计(来自应用程序向导)以管理DML事务的方式不同。
请注意,页面处理:Process Row of MY_DOC_STACK
看起来更像参数驱动。如果在某处有DML操作,它将首先基于通过Apex表单提交的每个输入变量的仔细筛选。
Apex还有许多其他方式可以管理DML交易; ......这个解决方案侧重于OP最有可能遇到的问题。
祝你好运!