Spring boot Multipart 文件上传为 json 正文的一部分

2022-09-03 13:12:16

我想知道是否有可能有一个可以接受包含多部分文件以及其他数据的json有效负载的post终结点。例如,我的身体对象看起来像这样:

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

安迪使用@RequestPart的解决方案非常完美。但是无法与postman一起验证,因为它似乎不支持指定每个多部分的内容类型,以按照他的答案中所述正确设置边界。

因此,要使用curl命令同时附加有效负载和文件,像这样的一些事情就可以了。

curl -i -X POST -H "Content-Type: multipart/mixed" \
-F "somepayload={\"name\":\"mypayloadname\"};type=application/json" \
-F "uploadfile=@somevalid.zip" http://localhost:8080/url

确保转义有效负载内容和一些无效.zip应该在执行 curl 的同一目录中,或者将其替换为文件的有效路径。


推荐