Spring загрузка Загрузка многостраничного файла как часть тела json
Я хотел бы знать, возможно ли иметь конечную точку сообщения, которая может принимать полезную нагрузку json, которая содержит многостраничный файл, а также другие данные. например мой объект тела будет выглядеть так:
public class Bio {
private Long id;
private String firstName;
private MultipartFile imageFile;
}
Отдельный, но связанный с этим вопрос заключается в том, что в примере документа springboot doc для загрузки файла https://spring.io/guides/gs/uploading-files/ файл является частью пути запроса, а не полезной нагрузки, Это кажется мне странным, так что есть способ привязать файл к телу запроса?
Ответы
Ответ 1
То, как я это делал в прошлом, - загрузить две отдельные части: одну для файла и одну для сопровождающего 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--
Ответ 2
Решение Andy для использования @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 должен находиться в том же каталоге, где выполняется завиток, или заменить его допустимым путем к файлу.