JSF 2.2 - 文件上传不使用Ajax的工作。 形式似乎有不正确的enctype(只能通过

2019-09-01 17:45发布

试图执行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这应该工作,但我的情况下,它是给我下面的错误:

该请求不包含多部分/格式数据或者多部分/混合流,内容类型报头是application / X WWW的窗体-urlencoded;字符集= UTF-8

展望请求,虽然我已经把我的表单的enctype正确,部分要求提交:

内容类型:应用/ X WWW的窗体-urlencoded;字符集= UTF-8面 - 请求:部分/ 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>

我使用的钻嘴鱼科2.2.0-M15,但试图与早期的版本。 有谁知道这个问题,我认为是一个错误的任何有用的信息?

Answer 1:

我不知道这是怎么回事,因为我以前没有见过这个。 用今天的钻嘴鱼科2.2.1快照,你可以从“下载时,下面的结构对我的作品实现JAR中提到的”链接是什么在JSF 2.2的新功能?

<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"));
}

// ...

我建议给新钻嘴鱼科版一试。 显然有在较旧版本钻嘴鱼科它未能建立一个适当的错误multipart/form-data使用请求中的<iframe>劈这最终导致该错误。 该mXX版本是beta版本无论如何,不应在生产的依据。 这个错误在理论上也已经特定浏览器,但它目前工作正常,我在Chrome 26,Firefox的20和IE 10。

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

似乎他们忘记设置frameborder属性0在生成<iframe> 我报的问题2861有关。



Answer 2:

我固定JSF(和其他部件)的JavaScript使能使用和不使用AJAX上的servlet标准2多部分请求。

在JSF 2.2文件上传的作品与Servlet版本3.此外称为“IFrame的交通运输”负责传输层开始是不是在释放状态。 所以我增加了一个透明的多部分要求,完成了传输层,并把所有一起上传标签:

<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 (请用翻译)。

评论欢迎。



Answer 3:

我与PrimeFaces同样的问题<p:fileUpload mode="simple"使用javax.faces-2.2.6.jar。 当我从我的禁用AJAX问题消失<h:commandButton 在我的情况下,它是确定的刷新整个页面。



文章来源: JSF 2.2 - fileupload does not work with Ajax. Form appears to have incorrect enctype (only via AJAX)