2013-05-02 9 views
5

Der Versuch, die JSF 2.2 Beispiel habe ich den folgenden Code haben zu implementieren:JSF 2.2 - Fileupload funktioniert nicht mit Ajax. Form erscheint eine falsche enctype zu haben (nur über AJAX)

<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> 

Nach einigen JSF 2.2 dies funktionieren sollte, aber in meinem Fall ist es gibt mir die folgende Fehlermeldung:

the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded;charset=UTF-8

Mit Blick auf die Anfrage, obwohl ich meine Form enctype richtig eingestellt haben, die teilweise Anfrage übermittelt:

Content-type:application/x-www-form-urlencoded;charset=UTF-8 Faces-Request:partial/ajax

Beachten Sie, dass auch modifiziert 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> 

I Mojarra 2.2.0-m15 bin mit aber versucht, dies mit früheren als auch Versionen. Kennt jemand nützliche Informationen zu diesem Problem, von dem ich annehme, dass es ein Fehler ist?

Antwort

5

Ich bin mir nicht sicher, was passiert, wie ich das vorher nicht gesehen habe. Das folgende Konstrukt funktioniert für mich, wenn die Mojarra 2.2.1 Snapshots heute mit dem Sie aus dem „implementation jar“ -Link in What's new in JSF 2.2? erwähnt herunterladen

<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> 

mit

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

// ... 

Ich empfehle die neuere Mojarra geben Version ein Versuch. Anscheinend gab es einen Fehler in einer älteren Mojarra-Version, die es unter Verwendung des -Hacks, der diesen Fehler letztendlich verursachte, nicht schaffte, eine richtige multipart/form-data-Anfrage zu erstellen. Die mXX Versionen sind sowieso Beta-Versionen und sollten nicht für die Produktion verwendet werden. Dieser Fehler könnte theoretisch auch Browser-spezifisch sein, aber er funktioniert derzeit gut für mich in Chrome 26, Firefox 20 und IE 10.

Das einzige Problem, das ich sehe, ist, dass die versteckte ist immer noch sichtbar in Chrome und Firefox wie folgt:

enter image description here

Es scheint, dass sie vergessen zu setzen frameborder Attribut 0 im generierten . Ich habe darüber issue 2861 berichtet.

+0

Danke für die Antwort BalusC. Ich habe mich über JSF2.2 geärgert, bin also auf die neueste Version von JSF2.1 zurückgekommen und habe dein Omnifaces-Render-Kit für html5 verwendet. Für den filwdownload habe ich dein Tutorial von http://balusc.blogspot.co.uk/2009/12/uploading-files-in-servlet-30.html gefolgt und überraschenderweise habe ich genau den gleichen Fehler bekommen. verursacht durch: org.apache.tomcat.util.http.fileupload.FileUploadBase $ InvalidContentTypeException: Die Anfrage enthält keinen multipart/form-data oder multipart/mixed Stream, Inhaltstypheader ist application/x-www-form -urlencoded; charset = UTF-8 –

+0

Vielleicht verschachteln Sie Formen? Es wäre jedoch ein ziemlich offensichtlicher Fehler gewesen, wenn Sie jemals versucht hätten, das Problem in ein vollwertiges SSCCE zu isolieren. – BalusC

+0

Ich wünschte, ich wäre so glücklich. Was ich oben habe, ist auf der eigenen Seite sowie dem Code aus Ihrem Beispiel. Das ist nur eine Form und es passiert nur, wenn ich mit Ajax einreiche, ansonsten funktioniert es gut. –

2

fixierte ich das JavaScript von JSF (und anderen Teilen) Multipart-Anforderungen mit und ohne AJAX auf Servlet-Standard 2.

Der JSF 2.2 Datei-Upload funktioniert beginnend mit Servlet-Version 3. Ferner ist das verantwortliche Transportschicht genannt zu ermöglichen "IFrame Transport" befand sich nicht im Freigabezustand. So habe ich eine transparente Mehrteiliger Anfrage, vervollständigte die Transportschicht und alle zusammen zu einem Upload tag:

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

Der Tag arbeitet zusammen mit AJAX, mit traditioneller Seite einreicht und mit Servlet-Standard 2/3. Nicht den schönsten Implementierung, aber es funktioniert fast transparent. Die Lösung ist erreichbar unter http://www.intersult.com/wiki/page/JSF%20Ext#section-JSF+Ext-FileUpload (Bitte Übersetzung verwenden).

Kommentare willkommen.

+0

Hast du es JSF-Jungs gemeldet? – BalusC

+1

Ich habe vor einigen Wochen einen relativen Fehler gemeldet, aber steht immer noch aus. Siehe: https: //java.net/jira/browse/JAVASERVERFACES-2871 –

0

hatte ich das gleiche Problem mit PrimeFaces<p:fileUpload mode="simple"javax.faces-2.2.6.jar verwenden. Das Problem verschwand, als ich Ajax von meinem <h:commandButton deaktivierte. In meinem Fall war es in Ordnung, die ganze Seite zu aktualisieren.