如何使用ApacheCommonsFileUpload让JSF上传文件
我知道如何使用Primefaces或Tomahawk进行文件上传,但是,我正在尝试使用Apache Commons FileUpload进行文件上传,到目前为止,我遇到了一些障碍。即使我的表单使用了如何使用ApacheCommonsFileUpload让JSF上传文件,jsf,file-upload,jsf-2,apache-commons-fileupload,Jsf,File Upload,Jsf 2,Apache Commons Fileupload,我知道如何使用Primefaces或Tomahawk进行文件上传,但是,我正在尝试使用Apache Commons FileUpload进行文件上传,到目前为止,我遇到了一些障碍。即使我的表单使用了多部分/表单数据,但当我提交表单时,内容类型变为application/x-www-form-urlencoded。这是我的密码 <h:body> <h:form enctype="multipart/form-data"> Upload File
多部分/表单数据
,但当我提交表单时,内容类型变为application/x-www-form-urlencoded
。这是我的密码
<h:body>
<h:form enctype="multipart/form-data">
Upload File
<input type="file" name="file"/>
<p:commandButton value="Submit" action="#{viewBean.submit}"/>
</h:form>
</h:body>
因此,当我尝试打印上面的内容类型时,它显示了application/x-www-form-urlencoded
。如果我将ajax=“false”
放入我的p:commandButton
,则甚至不会调用submit()
方法,但如果我取出enctype=“multipart/form data”
(仍保留ajax=“false”
),则会调用submit()
,但它不是多部分的,而是application/x-www-form-encode>,所以apache commons fileupload抛出一个异常,因为它不是多部分的。似乎无论我做什么,我都无法获得多部分请求。请帮忙
因此,当我尝试打印上面的内容类型时,它显示application/x-www-form-urlencoded
默认情况下,
发送级别为1的ajax请求XMLHttpRequest
。这不支持多部分/表单数据
。仅支持它,但它仅在最新的浏览器(也支持HTML5的浏览器)中受支持,并且未在JSF JS API或PrimeFaces JS API中实现
如果我将ajax=“false”放在我的p:commandButton上,那么submit()方法甚至不会被调用
但是,通过这种方式,将发送一个完整的多部分/表单数据
。没有调用submit方法只是因为2.2版之前的JSF不支持多部分/表单数据
即时请求。默认情况下,JSF使用底层HTTP servlet请求上的request.getParameter()
和getParameterMap()
收集提交的数据。但是,当使用非application/x-www-form-urlencoded
的编码时,这将返回null
。由于JSF根据提交的数据确定要调用的操作方法,因此当数据为null
时,它将无法找到并调用它
理论上,如果您创建一个过滤器
,它使用Apache Commons FileUpload或新的Servlet 3.0/方法从多部分/表单数据
请求中提取数据,并使用覆盖getParameter()的自定义实现包装当前HTTP Servlet请求
调用,其中提供了提取数据的映射,那么JSF将能够根据getParameter()
调用的结果执行所需的工作。您可以在中找到一个使用Servlet 3.0 API的具体示例,同一个示例稍微更改为在中使用Apache Commons FileUpload
即将发布的JSF2.2将有一个新的
组件,该组件可绑定到Servlet3.0属性
<h:form enctype="multipart/form-data">
<h:inputFile value="#{bean.file}" />
<h:commandButton value="submit" action="#{bean.submit}" />
</h:form>
JSF2.2最终版本计划在第1季度末发布,但目前作为快照版本提供。非常感谢。很高兴知道所有这些信息。@BalusC我按照您所说的那样创建了一个过滤器
,但是如果h:form
具有enctype=“multipart/form data”
,则操作方法不会触发。我使用的是JSF1.2。你能告诉我为什么会这样吗?我问了一个问题@Tapas:我已经发布了一个答案。请不要忘记未来问题的[jsf]
标签。我没有看到你的问题,因为我没有定期浏览[jsf-1.2]
。
<h:form enctype="multipart/form-data">
<h:inputFile value="#{bean.file}" />
<h:commandButton value="submit" action="#{bean.submit}" />
</h:form>
private Part file;