2015-01-27 4 views
11

Я хотел бы знать, возможно ли иметь конечную точку сообщения, которая может принимать полезную нагрузку json, которая содержит многостраничный файл, а также другие данные. например мой объект тела будет выглядеть следующим образом:Spring boot Загрузка многостраничного файла как часть тела json

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

отдельный, но связанный вопрос заключается в том, что в примере дока springboot для загрузки файла, https://spring.io/guides/gs/uploading-files/, файл является частью пути запроса, а не полезной нагрузки. Мне это кажется странным, так есть ли способ привязать файл к телу запроса?

ответ

11

То, как я это делал в прошлом, это загрузить две отдельные части: одну для файла и одну для сопровождающего JSON. Ваш метод контроллера будет выглядеть примерно так:

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

Затем он будет потреблять запросы, которые выглядят следующим образом:

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. Спасибо за этот ответ –

5

решение Энди использовать @RequestPart работал отлично. Но не удается проверить с почтальоном, поскольку он, похоже, не поддерживает, указывая тип содержимого каждого мультипартимента, чтобы правильно установить границы, как описано в его ответе.

Таким образом, чтобы приложить как полезную нагрузку, так и файл с помощью команды curl, некоторые вещи, как это, будут делать.

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

Убедитесь, что вы избежать содержание полезной нагрузки и somevalid.zip должны быть там в той же директории, где выполняется скручивание или заменить его правильный путь к файлу.

+2

Как для почтальона, так и для завивки я получаю: '{" timestamp ": 1471958647719," status ":" ERROR "," data ":" Content type 'application/octet-stream' not supported "}' – Derp