簡體   English   中英

JSF 2.2 - fileupload不適用於Ajax。 表單似乎有不正確的enctype(僅通過AJAX)

[英]JSF 2.2 - fileupload does not work with Ajax. Form appears to have incorrect enctype (only via AJAX)

嘗試實現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,但也嘗試使用早期版本。 有誰知道關於這個問題的任何有用的信息,我認為這是一個錯誤?

我不知道發生了什么事,因為我以前沒見過這個。 當使用今天的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版本中存在一個錯誤,該錯誤無法使用<iframe> hack創建正確的multipart/form-data請求,最終導致此錯誤。 mXX版本無論如何都是beta版本,不應該依賴於生產。 理論上這個錯誤也可能是瀏覽器特定的,但它在Chrome 26,Firefox 20和IE 10中目前適用於我。

我看到的唯一問題是隱藏的<iframe>在Chrome和Firefox中仍然可見,如下所示:

在此輸入圖像描述

似乎他們忘記在生成的<iframe>中將frameborder屬性設置為0 我已經報告了2861號問題

我修復了JSF(和其他部分)的JavaScript,以便在servlet標准2上啟用和不使用AJAX的Multipart請求。

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 (請使用翻譯)訪問該解決方案。

歡迎評論。

我使用javax.faces-2.2.6.jarPrimeFaces <p:fileUpload mode="simple"有同樣的問題。 當我從<h:commandButton禁用ajax時,問題就消失了。 在我的情況下,刷新整個頁面是可以的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM