Oracle APEX 20.x如何通过PL/SQL将文件以Blob格式上传至自定义表
APEX 20.x 纯PL/SQL实现文件Blob上传入库方案
前置配置补全
你现有基础配置已经完成80%,先补3个容易遗漏的必要设置:
- 修正隐藏项命名:你创建的文件名隐藏项需要加页面前缀,即命名为
P1_FILE_NAME,和其他页面项命名规则保持一致,否则值无法正常传递 - 配置
P1_CHOOSE_FILE的映射关系:在该文件浏览项的「设置」板块,找到「文件名存储在页面项」下拉选P1_FILE_NAME,「MIME类型存储在页面项」下拉选P1_MIMETYPE - 所有相关页面项(
P1_CHOOSE_FILE、P1_MIMETYPE、P1_FILE_NAME)的「会话状态保护」属性设置为无限制,避免提交时触发状态校验报错 - 上传按钮绑定的动态动作配置:触发事件选「单击」,真操作选「执行PL/SQL代码」,在操作配置的「要提交的页面项」栏填入
P1_CHOOSE_FILE,P1_MIMETYPE,P1_FILE_NAME,确保服务器端能拿到上传的文件数据
核心PL/SQL代码
直接将以下代码粘贴到动态动作的PL/SQL代码输入框即可:
BEGIN INSERT INTO upload_file ( fileblob, filename, mimetype, createdate ) VALUES ( :P1_CHOOSE_FILE, :P1_FILE_NAME, :P1_MIMETYPE, SYSDATE ); COMMIT; -- 上传成功后清空表单、弹出提示 apex_util.set_session_state(p_name => 'P1_CHOOSE_FILE', p_value => NULL); apex_util.set_session_state(p_name => 'P1_FILE_NAME', p_value => NULL); apex_util.set_session_state(p_name => 'P1_MIMETYPE', p_value => NULL); apex_message.add_success(p_message => '文件上传完成'); END;
说明:不需要额外给创建时间隐藏项传值,直接用数据库内置
SYSDATE取值更准确,可避免前端传值的时区偏差问题。
操作步骤对应界面指引(APEX 20.x版本)
- 文件浏览项配置界面:在页面设计器左侧渲染树选中
P1_CHOOSE_FILE,右侧属性面板找到「设置」分组,即可看到Blob列、文件名、MIME类型的映射配置项,按前面要求选对应页面项即可 - 动态动作配置界面:在渲染树选中你创建的上传按钮,右侧属性面板切到「动态动作」标签,选中你绑定的单击动作,在「真」操作下选「执行PL/SQL代码」,下方即可看到代码输入框、要提交的页面项输入栏
- 验证方式:配置完成后保存页面运行,选择本地文件点击上传,弹出成功提示后,用数据库客户端查询
upload_file表,即可看到对应文件记录,fileblob字段长度和本地文件大小一致即为配置成功
常见问题排查
- 插入的
fileblob字段长度为0:检查动态动作配置里的「要提交的页面项」是否漏加P1_CHOOSE_FILE,未加入提交列表时服务器端无法获取文件二进制内容 filename/mimetype字段为空:检查P1_CHOOSE_FILE的设置板块,是否正确绑定了对应的文件名、MIME类型隐藏页面项- 提交时报会话状态错误:检查所有相关页面项的「会话状态保护」属性是否设置为「无限制」
内容的提问来源于stack exchange,提问作者kiric8494
相关产品推荐
相关产品推荐

