2015-01-27 12 views
11

Chciałbym wiedzieć, czy możliwe jest posiadanie końcowego punktu końcowego, który akceptuje json ładunek zawierający plik wieloczęściowy, jak również inne dane. na przykład mój obiekt ciało będzie wyglądać następująco:Wiosenny rozruch Przesyłanie pliku wieloczęściowego w ramach json body

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

Odrębną kwestią jest jednak powiązany że w przykładzie doc springboot dla przesyłając plik https://spring.io/guides/gs/uploading-files/ plik jest częścią ścieżki żądanie zamiast ładunku. Wydaje mi się to dziwne, więc czy istnieje sposób na powiązanie pliku z treścią żądania?

Odpowiedz

11

Sposób, w jaki to zrobiłem w przeszłości, polega na przesłaniu dwóch oddzielnych części, jednej dla pliku i jednej dla dołączonego JSON. Twoja metoda kontroler będzie wyglądać mniej więcej tak:

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

Byłoby wtedy zużywają żądania, które wyglądają tak:

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. Dzięki za tę odpowiedź –

5

rozwiązanie Andy'ego używać @RequestPart działało idealnie. Ale nie jest w stanie sprawdzić poprawności z listonoszem, ponieważ nie wydaje się wspierać, określając typ zawartości każdego multipartu, aby poprawnie ustawić granice, jak opisano w jego odpowiedzi.

Aby dołączyć zarówno ładunek, jak i plik za pomocą polecenia curl, zrobi to coś takiego.

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

Upewnij się uciec zawartości ładunku i somevalid.zip powinno tam być w tym samym katalogu, w którym jest wykonywany curl lub zastąpić go prawidłową ścieżkę do pliku.

+2

Dla listonosza i curl otrzymuję: '{" znacznik czasu ": 1471958647719," status ":" BŁĄD "," dane ":" Typ treści "aplikacja/strumień-oktetu" nieobsługiwane "}' – Derp