2015-01-27 7 views
11

Vorrei sapere se è possibile avere un endpoint di posta che può accettare un payload json che contiene un multipartfile e altri dati. per esempio. il mio oggetto corpo sarà simile:Spring boot Caricamento di file multipart come parte di json body

public class Bio { 
    private Long id; 
    private String firstName; 
    private MultipartFile imageFile; 
} 

Una questione distinta ma collegata è che nell'esempio doc springboot per il caricamento di un file, https://spring.io/guides/gs/uploading-files/, il file fa parte del percorso della richiesta piuttosto che il carico utile. Questo mi sembra strano, quindi c'è un modo per legare il file al corpo della richiesta?

risposta

11

Il modo in cui l'ho fatto in passato è caricare due parti separate, una per il file e una per il JSON di accompagnamento. Il tuo metodo di controllo sarebbe simile a questa:

public void create(@RequestPart("foo") Foo foo, 
     @RequestPart("image") MultipartFile image) 
    // … 
} 

Sarebbe quindi consumare le richieste che assomigliano a questo:

Content-Type: multipart/mixed; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm 
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm 
Content-Disposition: form-data; name="foo" 
Content-Type: application/json;charset=UTF-8 
{"a":"alpha","b":"bravo"} 
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm 
Content-Disposition: form-data; name="image"; filename="foo.png" 
Content-Type: application/octet-stream 
Content-Length: 734003 
<binary data> 
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm-- 
+0

Nice. Grazie per questa risposta –

5

soluzione di Andy utilizzare @RequestPart ha funzionato perfettamente. Ma non in grado di convalidare con il postino, in quanto non sembra supportare, specificando il tipo di contenuto di ogni multipart per impostare i limiti correttamente come descritto nella sua risposta.

Quindi, per allegare sia un carico utile che un file utilizzando il comando di arricciatura, qualcosa del genere andrà bene.

curl -i -X POST -H "Content-Type: multipart/mixed" \ 
-F "somepayload={\"name\":\"mypayloadname\"};type=application/json" \ 
-F "[email protected]" http://localhost:8080/url 

Assicurati di fuggire il contenuto del carico utile e somevalid.zip dovrebbe essere lì nella stessa directory in cui viene eseguito ricciolo o sostituirla con percorso valido per il file.

+2

Sia per postman che per arricciare ottengo: '{" timestamp ": 1471958647719," status ":" ERROR "," data ":" Content type "application/octet-stream" not supported "}' – Derp

Problemi correlati