8

尝试实现 JSF 2.2 示例我有以下代码:

<h:form prependId="false" enctype="multipart/form-data">

    <!-- Now it's the AJAX file upload component -->
    <h:inputFile id="fileUpload" value="#{someBean.file}" >
        <f:ajax />
    </h:inputFile>

    <h:commandButton value="Upload" />
</h:form>

根据一些 JSF 2.2,这应该可以工作,但在我的情况下,它给了我以下错误:

请求不包含 multipart/form-data 或 multipart/mixed 流,内容类型标头为 application/x-www-form-urlencoded;charset=UTF-8

尽管我已正确设置表单 enctype,但查看请求,部分请求提交:

内容类型:application/x-www-form-urlencoded;charset=UTF-8 Faces-Request:partial/ajax

请注意,web.xml 也被修改为:

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <multipart-config>
        <location>c:\dotmp</location>
        <max-file-size>20848820</max-file-size>
        <max-request-size>418018841</max-request-size>
        <file-size-threshold>1048576</file-size-threshold>
    </multipart-config>
</servlet>

我正在使用 Mojarra 2.2.0-m15,但也尝试过使用早期版本。有谁知道有关此问题的任何有用信息,我认为这是一个错误?

4

3 回答 3

7

我不确定发生了什么,因为我以前从未见过。当使用今天的 Mojarra 2.2.1 快照时,以下构造对我有用,您可以从JSF 2.2中的新增功能中提到的“实现 jar ”链接下载该快照。

<h:form enctype="multipart/form-data">
    <h:inputFile value="#{bean.file}" required="true">
        <f:ajax listener="#{bean.handleFileUpload}" render="@form" />
    </h:inputFile>
    <h:messages />
</h:form>

private Part file;

public void handleFileUpload(AjaxBehaviorEvent event) {
    System.out.println("file size: " + file.getSize());
    System.out.println("file type: " + file.getContentType());
    System.out.println("file info: " + file.getHeader("Content-Disposition"));
}

// ...

我建议尝试较新的 Mojarra 版本。显然,较旧的 Mojarra 版本中存在一个错误,该错误无法使用最终导致此错误multipart/form-data的 hack 创建正确的请求。<iframe>无论如何,这些mXX版本都是 beta 版本,不应依赖于生产。这个错误理论上也可能是特定于浏览器的,但它目前在 Chrome 26、Firefox 20 和 IE 10 中对我来说很好。

我看到的唯一问题是隐藏<iframe>在 Chrome 和 Firefox 中仍然可见,如下所示:

在此处输入图像描述

看来他们忘记frameborder0生成的<iframe>. 我已经报告了关于此的问题 2861

于 2013-05-02T14:04:28.650 回答
2

我修复了 JSF(和其他部分)的 JavaScript,以在 servlet 标准 2 上启用带和不带 AJAX 的多部分请求。

JSF 2.2 文件上传从 servlet 版本 3 开始工作。此外,称为“IFrame Transport”的负责传输层未处于发布状态。所以我添加了一个透明的 Multipart 请求,完成了传输层并将所有内容放在一个上传标签中:

<e:inputFile id="file" value="#{fileUpload.file}" filename="#{fileUpload.filename}"
    mimeType="#{fileUpload.mimeType}"/>

该标签与 AJAX、传统页面提交和 servlet 标准 2 / 3 一起使用。这不是最好的实现,但它的工作几乎是透明的。该解决方案可在http://www.intersult.com/wiki/page/JSF%20Ext#section-JSF+Ext-FileUpload 访问(请使用翻译)。

欢迎评论。

于 2013-07-08T17:06:04.903 回答
0

我对使用javax.faces-2.2.6.jar的PrimeFaces 有同样的问题。当我从我的. 就我而言,刷新整个页面是可以的。<p:fileUpload mode="simple"<h:commandButton

于 2014-04-23T12:36:06.160 回答