2013-05-02 11 views
5

Próbuje realizować przykład JSF 2.2 Mam następujący kod:JSF 2.2 - fileupload nie działa z Ajaxem. Postać wydaje się mieć nieprawidłowy enctype (tylko za pośrednictwem 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> 

Według niektórych JSF 2.2 to powinno działać, ale w moim przypadku jest to danie mi następujący błąd:

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

Patrząc na życzenie chociaż mam ustawić moja forma enctype poprawnie, częściowy wniosek przedkłada:

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

Uwaga web.xml który również został zmodyfikowany:

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

Używam Mojarra 2.2.0-M15, ale próbowałem z wcześniejszymi wersjami, jak również. Czy ktoś wie jakieś przydatne informacje na temat tego problemu, który zakładam jest błąd?

Odpowiedz

5

Nie jestem pewien, co się dzieje, ponieważ nie widziałem tego wcześniej. Poniższa konstrukcja działa na mnie podczas korzystania z dzisiejszą Mojarra 2.2.1 migawkę, które można pobrać z linku „implementation jar” wymienionego w 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> 

z

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

// ... 

polecam dać nowszą Mojarra wypróbuj wersję. Wygląda na to, że w starszej wersji programu Mojarra wystąpił błąd, który nie zdołał utworzyć prawidłowego żądania za pomocą hakowania multipart/form-data, co ostatecznie spowodowało ten błąd. Wersje mXX są i tak wersjami beta i nie należy polegać na ich produkcji. Ten błąd teoretycznie mógł być również związany z przeglądarkami, ale obecnie działa dobrze dla mnie w Chrome 26, Firefox 20 i IE 10.

Jedyny problem, który widzę to to, że ukryty jest nadal widoczny w Chrome Firefox jak poniżej:

enter image description here

wydaje się, że oni zapomnieli ustawić frameborder atrybut 0 w wygenerowanym . Dowiedziałem się o tym issue 2861.

+0

Dzięki za odpowiedź BalusC. Denerwowałem się JSF2.2, więc wróciłem do najnowszej wersji JSF2.1 i użyłem twojego zestawu renderów Omnifaces dla html5. Do filwdownload poszedłem za twoim tutorialem z http://balusc.blogspot.co.uk/2009/12/uploading-files-in-servlet-30.html i zaskakująco dostałem dokładnie ten sam błąd. Spowodowany przez: org.apache.tomcat.util.http.fileupload.FileUploadBase $ InvalidContentTypeException: wniosek nie zawiera multipart/form-data lub wieloczęściowy/mieszany strumień, typ zawartości nagłówka jest application/x-www-form -urlencoded; charset = UTF-8 –

+0

Być może zagnieżdżasz formularze? Byłby to raczej oczywisty błąd, gdybyś kiedykolwiek spróbował wyizolować problem w pełni wartą SSCCE. – BalusC

+0

Chciałbym mieć to szczęście. To, co mam powyżej, znajduje się na własnej stronie, a także na kodzie z twojego przykładu. Jest to tylko jedna forma, a dzieje się tak tylko wtedy, gdy przesyłam przy użyciu Ajax, w przeciwnym razie działa dobrze. –

2

I ustalony JavaScript JSF (i inne części) w celu umożliwienia wieloczęściowych żądań bez AJAX na standardzie serwletu 2.

JSF 2.2 upload plików prace począwszy serwletu wersji 3. Ponadto odpowiedzialny warstwy transportowej o nazwie "IFrame Transport" nie było w stanie zwolnienia. Więc dodałem przejrzystego wniosek wielowarstwowym zakończone warstwy transportowej i umieścić wszystkie razem ze znacznikiem Dodano:

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

Tag współpracuje z AJAX, z tradycyjnej strony podnosi i ze standardem serwletu 2/3. Nie najpiękniejszy wdrożenie, ale działa prawie przezroczyście. Rozwiązanie jest dostępne pod adresem http://www.intersult.com/wiki/page/JSF%20Ext#section-JSF+Ext-FileUpload (Proszę użyć tłumaczenia).

Komentarze mile widziane.

+0

Czy zgłosił go do JSF facetów? – BalusC

+1

Podniosłem względny błąd kilka tygodni temu, ale wciąż jest w toku. Zobacz: https: //java.net/jira/browse/JAVASERVERFACES-2871 –

0

miałem ten sam problem z PrimeFaces<p:fileUpload mode="simple" korzystających javax.faces-2.2.6.jar. Problem zniknął, gdy wyłączono obsługę ajax z mojego <h:commandButton. W moim przypadku można odświeżyć całą stronę.

Powiązane problemy