2013-06-18 13 views
7

Stworzyłem jersey spokojny usługę internetową, gdzie zarządzanego przesłać wielokrotnością plików korzystających @Context HttpServletRequest request jako metoda podpisu, który pracuje ładnie.
Chodzi o to, aby sprowadzić innych pól formularza muszę powtarzalnie sprawdzić z .isFormField(); metody z względnym .getName(); dla pliku lub .getFieldName(); i .getString(); metody, aby sprawdzić, czy wymagane pola są obecne lub nie każdym razem, gdy serwis internetowy nazywa co moim zdaniem trochę długi i kosztowny proces, jeśli istnieje kilka innych dziedzin.Multiple File Upload przy użyciu @Context HttpServletRequest z @FormDataParam w koszulce

prostsze podejście było użyć @FormDataParam gdzie usługa używana do odsłoniętej z parametrem, który klient musiał przejść jednak problemu to nie jestem w stanie przekazać więcej niż jeden plik za jednym zamachem.

Ponieważ nie można również użyć request.getParameter("field1");, aby uzyskać inne pola formularza, jeśli typ nośnika lub encja to multipart/form-data.

Ilekroć próbował połączyć oba @FormDataParam i @Context HttpServletRequest request razem, to rzuca wyjątek:
org.apache.tomcat.util.http.fileupload.FileUploadException: Stream closed
podczas parsowania wniosek z .parseRequest(request); metody ServletFileUpload klasie.

Uprzejmie sugerujemy dobre podejście Jak mogę uzyskać wiele plików przesyłanych z wymaganymi polami formularza tak łatwo, jak @FormDataParam w jersey.

podejście do wielokrotnego przesłanie pliku:

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
@Path("/multipleFiles") 
public String restDemo(@Context HttpServletRequest request) 
{ 
    //...code goes here 
} 

Moja forma:

enter image description here

wyjściowy: (po parsowania życzenie)

pole1> abc
pole2> xyz
Chrysanthemum.jpg Rozmiar: 879.394
Desert.jpg Rozmiar: 845.941
Hydrangeas.jpg Rozmiar: 595.284
Jellyfish.jpg Rozmiar: 775702

+0

Nie do końca rozumiem, dlaczego nie można przesłać więcej niż jednego pliku podczas korzystania z @FormDataParam? Czy "wiele plików" oznacza, że ​​potrzebujesz zmiennej liczby plików do przesłania (użytkownik może kliknąć "dodaj więcej plików" w formularzu i uzyskać dodatkowe pola przesyłania)? – Jonas

+0

@Jas to prawda, że ​​użytkownik może dodać więcej plików z interfejsu użytkownika, ale jakie podejście należy zastosować, aby nadrobić zaległości ze wszystkimi plikami za pomocą '@ FormDataParam'? Zgodnie z moją wiedzą mapowanie wielu plików w jednym '@ FormDataParam' nie jest możliwe. – agpt

Odpowiedz

15

Jeśli pola mają taką samą nazwę, jak ten:

<form name="formtest" action="rest/multipleFiles" method="POST" enctype="multipart/form-data"> 
    <input type="text" name="atext" value="abc" /> 
    <input type="text" name="btext" value="123" /> 
    <input type="file" name="zfile" value="" /> 
    <input type="file" name="zfile" value="" /> 
    <input type="submit" value="submit" /> 
</form> 

można użyć:

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
@Path("/multipleFiles")  
public String restDemo(@FormDataParam("zfile") List<FormDataBodyPart> zfile) 

Teraz odradzam używanie HttpServletRequest.Jeśli potrzebujesz przetworzyć wszystko, użyj tego:

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA)  
@Produces(MediaType.APPLICATION_JSON) 
@Path("/multipleFiles") 
public String restDemo(FormDataMultiPart formParams) { 
    formParams.getFields(); 
} 
+0

Czy możesz wyjaśnić, dlaczego nie należy używać 'HttpServletRequest', ponieważ wiem, że nie mogę go przetworzyć dla innych szczegółów, ale czy istnieje jakaś inna szkoda z jego używania? – agpt

+6

Jeśli użyjesz HttpServletRequest zmieszanego z Jersey, może on zamykać strumienie, bufory, zanim będziesz mógł z nich korzystać. Ponieważ JAX-RS został stworzony w celu uniknięcia bezpośredniego korzystania z Servlet. Teraz są przypadki, w których może zajść potrzeba bezpośredniego interakcji z serwletem, ale tylko w razie potrzeby. Wszystko zależy od twojego kontenera WWW i implementacji JAX-RS, Tomcat/Glassfish/JBoss vs Jersey/CXF/Resteasy. –

+0

+1 do wyjaśnienia, dlaczego nie używać 'HttpServletRequest' w jax-rs twój powód jest prawdziwy, ponieważ mam do czynienia z tym samym problemem. – agpt