2013-03-07 4 views
8

Ho lavorato in un servizio web che consuma e produce file JSON utilizzando Apache CXF in combinazione con Jackson.
Tuttavia, uno dei metodi del servizio dovrebbe essere in grado di salvare un'immagine caricata da un'applicazione mobile che rende una richiesta POST multipart/form-data al mio webservice, e non so come trattare questo tipo di tipo di contenuto all'interno il mio contesto. Generalmente creiamo oggetti "Richiesta" e "Risposta" per consumare e produrre il JSON, tuttavia temo che questo non funzioni in questo caso.Consumare un multipart/form-data tramite RESTful CXF

Questo è il formato della richiesta:

Content-type: multipart/form-data 
"Description": text/plain 
"Path": text/plain 
"Image": image/jpeg 

Come si consuma correttamente questo tipo di richiesta e salvare il lato server di immagini?


[EDIT]

sono riuscito a consumare multipart/form-data utilizzando questo:

public returnType savePicture(
       @Multipart(value = "mode", type = "text/plain") String mode, 
       @Multipart(value = "type", type = "text/plain") String type, 
       @Multipart(value = "path", type = "text/plain") String path 
       @Multipart(value = "image", type = "image/jpeg") Attachment image 
      ) 
    { 

Tuttavia, quando si cerca di consumare la seguente richiesta POST:

Content-type: multipart/form-data, boundary=AaB03x 

--AaB03x 
content-disposition: form-data; name="mode" 

T 
--AaB03x 
content-disposition: form-data; name="type" 

M 
--AaB03x 
content-disposition: form-data; name="path" 

c:/img/ 
--AaB03x 
content-disposition: form-data; name="image"; filename="image.jpg" 
Content-Type: image/jpeg 
Content-Transfer-Encoding: binary 

imgdata 
--AaB03x-- 

Ho ricevuto il seguente errore:

javax.ws.rs.BadRequestException: org.apache.cxf.jaxrs.utils.multipart.MultipartReadException: No multipart with content id type found, request content type : multipart/form-data;boundary=AaB03x

Quando ho consumano solo modalità, per esempio, funziona benissimo. Si interrompe solo per 2 o più parametri. Qualche idea sul perché è sbagliato?

+1

1. http://stackoverflow.com/questions/10246579/jax-rs-with-cxf-rest-assured-handling-multiparam-file-upload 2. http://stackoverflow.com/questions/8913382/uploading-multiple-files-and- metadata-with-cxf Consulta questi – Sikorski

+1

3. http://cxf.apache.org/docs/jax-rs-multiparts.html – Sikorski

+0

Grazie per i link, cercherò di capire qualcosa di utile da loro. Sono riuscito a consumare il testo/plain, ho appena avuto problemi con l'immagine ora, ma non ho provato con inputStream come suggerisce il link 1. – fcm

risposta

0

Sembra che abbiamo riscontrato il problema ed era correlato al formato della richiesta. Il formato corretto avrebbe dovuto essere:

Content-type: multipart/form-data, boundary=AaB03x 

--AaB03x 
content-disposition: form-data; name="mode" 

T--AaB03x 

content-disposition: form-data; name="type" 

M--AaB03x 

content-disposition: form-data; name="path" 

c:/img/--AaB03x 

content-disposition: form-data; name="image"; filename="image.jpg" 
Content-Type: image/jpeg 
Content-Transfer-Encoding: binary 

imgdata--AaB03x-- 

Cambiare in questo formato mi ha permesso di consumare gli altri parametri.

1

Ho affrontato un problema simile qualche tempo fa.

Il seguente codice ha fatto il trucco per me

@POST 
@Consumes("multipart/form-data") 
public void yourMethod(<params>) throws Exception { 
} 

In breve, è penso che il @Consumes annotazione ti stai perdendo.