如何为PrimeFaces高级文件上传组件添加请求参数
解决PrimeFaces高级模式p:fileUpload传递请求参数到Filter的问题
我之前也踩过这个坑,PrimeFaces的高级文件上传模式和simple模式的请求处理逻辑差异很大,普通的f:param确实不管用。给你几个亲测有效的解决方案:
方案一:修正ClientAPI参数设置方式
你之前尝试的ClientAPI思路是对的,但语法写错了——ext.params需要是键值对对象,而不是数组。加上widgetVar来确保正确访问组件配置,代码如下:
<h:form enctype="multipart/form-data"> <p:fileUpload id="fileUploadPrimefaces1" widgetVar="myUploadWidget" listener="#{myBean.handleFileUpload}" mode="advanced" dragDropSupport="true" onstart="myUploadWidget.cfg.ext = { params: { doStuffInFilter: 'true' } }" /> </h:form>
这样设置后,上传请求会带上这个参数,Filter里就能通过request.getParameter("doStuffInFilter")拿到值。
方案二:利用表单隐藏字段传递
高级模式的上传请求会自动包含表单内的所有输入字段,所以可以在表单里加一个隐藏字段直接传递参数:
<h:form enctype="multipart/form-data"> <h:inputHidden name="doStuffInFilter" value="true" /> <p:fileUpload id="fileUploadPrimefaces1" listener="#{myBean.handleFileUpload}" mode="advanced" dragDropSupport="true" ... /> </h:form>
这个方法兼容性最好,不管PrimeFaces用iframe还是XHR上传都能生效,Filter里直接读取参数即可。
方案三:针对XHR上传的FormData追加参数(PrimeFaces 6.0+)
如果你的项目用的是较新版本的PrimeFaces(6.0+),高级模式默认用XHR上传,可以通过onBeforeSend回调直接往FormData里追加参数:
<h:form enctype="multipart/form-data"> <p:fileUpload id="fileUploadPrimefaces1" listener="#{myBean.handleFileUpload}" mode="advanced" dragDropSupport="true" onBeforeSend="function(xhr, formData) { formData.append('doStuffInFilter', 'true'); }" /> </h:form>
这个方法更直接,适合需要动态设置参数的场景(比如根据用户操作实时改变参数值)。
为什么之前的方法失效?
f:param只对p:commandButton这类触发请求的组件生效,p:fileUpload高级模式是组件自身独立发起上传请求,不会识别子元素里的f:param。- 你之前写的
params: [name: 'doStuffInFilter', value: 'true']是错误的语法,PrimeFaces期望的是一个对象结构,而非数组,所以参数没有被正确传递到服务端。
内容的提问来源于stack exchange,提问作者F. Zi
相关产品推荐
相关产品推荐

