2013-05-02 9 views
5

Cercando di implementare l'esempio JSF 2.2 Ho il seguente codice:JSF 2.2 - fileupload non funziona con Ajax. Modulo sembra avere enctype non corretta (solo tramite 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> 

Secondo alcuni JSF 2.2 questo dovrebbe funzionare, ma nel mio caso mi la sta dando seguente errore:

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

Guardando la richiesta anche se ho impostato correttamente la mia forma enctype, la richiesta parziale sottopone:

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

Si noti che anche web.xml è stato modificato per:

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

Sto usando Mojarra 2.2.0-M15, ma ha provato questo con le versioni precedenti pure. Qualcuno conosce qualche informazione utile su questo problema, che presumo sia un bug?

risposta

5

Non sono sicuro di cosa stia succedendo visto che non l'ho mai visto prima. Il seguente costrutto funziona per me quando si utilizza Mojarra 2.2.1 snapshot di oggi, che è possibile scaricare dal link "implementation jar" di cui parla What's new in 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> 

con

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

// ... 

vi consiglio di dare la più recente Mojarra versione una prova. Apparentemente c'era un bug in una vecchia versione di Mojarra che non è riuscito a creare una richiesta corretta multipart/form-data usando l'hack che alla fine ha causato questo errore. Le versioni mXX sono comunque versioni beta e non dovrebbero essere considerate affidabili per la produzione. Questo errore potrebbe in teoria essere specifico del browser, ma funziona correttamente per me in Chrome 26, Firefox 20 e IE 10.

L'unico problema che sto vedendo è che il nascosto è ancora visibile in Chrome e Firefox come di seguito:

enter image description here

sembra che stanno dimenticato di impostare frameborder attributo 0 nel generato . Ho riferito di issue 2861.

+0

Grazie per la risposta BalusC. Mi sono infastidito con JSF2.2, quindi sono tornato all'ultima versione di JSF2.1 e ho utilizzato il kit di rendering Omnifaces per html5. Per il download ho seguito il tuo tutorial da http://balusc.blogspot.co.uk/2009/12/uploading-files-in-servlet-30.html e sorprendentemente ho ottenuto lo stesso errore. Causato da: org.apache.tomcat.util.http.fileupload.FileUploadBase $ InvalidContentTypeException: la richiesta non contiene un flusso multipart/form-data o multipart/mixed, l'intestazione del tipo di contenuto è application/x-www-form -urlencoded; charset = UTF-8 –

+0

Forse stai annidando i moduli? Sarebbe stato un errore piuttosto ovvio se avessi mai tentato di isolare il problema in un vero SSCCE. – BalusC

+0

Vorrei essere così fortunato. Quello che ho sopra è sulla sua stessa pagina e sul codice del tuo esempio. L'unico è un modulo e succede solo quando invio usando Ajax, altrimenti funziona correttamente. –

2

ho fissato il JavaScript del JSF (e di altre parti) per attivare le richieste a più parti con e senza AJAX sullo standard servlet 2.

Il caricamento di file JSF 2.2 funziona a cominciare servlet versione 3. Inoltre il livello di trasporto responsabile chiamato "Trasporto IFrame" non era in stato di rilascio. Così ho aggiunto una richiesta Multipart trasparente, completato il livello di trasporto e mettere tutti insieme per un tag upload:

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

Il Tag collabora con AJAX, con la pagina tradizionale sostiene e con standard di servlet 2/3. Non il più bello implementazione, ma funziona quasi trasparente. La soluzione è accessibile allo http://www.intersult.com/wiki/page/JSF%20Ext#section-JSF+Ext-FileUpload (Si prega di utilizzare la traduzione).

commenti accolti.

+0

Hai segnalato a ragazzi JSF? – BalusC

+1

Ho sollevato un bug relativo qualche settimana fa ma è ancora in sospeso. Vedi: https: //java.net/jira/browse/JAVASERVERFACES-2871 –

0

Ho avuto lo stesso problema con primefaces<p:fileUpload mode="simple" utilizzando javax.faces-2.2.6.jar. Il problema è scomparso quando ho disabilitato ajax dal mio <h:commandButton. Nel mio caso è stato OK per aggiornare l'intera pagina.

Problemi correlati