Подтвердить что ты не робот

Spring загрузка Загрузка многостраничного файла как часть тела json

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

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

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

4b9b3361

Ответ 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 должен находиться в том же каталоге, где выполняется завиток, или заменить его допустимым путем к файлу.