如何使用ApacheCommonsFileUpload让JSF上传文件

如何使用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

我知道如何使用Primefaces或Tomahawk进行文件上传,但是,我正在尝试使用Apache Commons FileUpload进行文件上传,到目前为止,我遇到了一些障碍。即使我的表单使用了
多部分/表单数据
,但当我提交表单时,内容类型变为
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;