Spring Boot多部分文件上传作为JSON主体的一部分

15
我想知道是否有可能创建一个接受包含多部分文件和其他数据的json有效载荷的帖子终点。例如,我的正文对象将如下所示:
public class Bio {
    private Long id;
    private String firstName;
    private MultipartFile imageFile;
}

有一个独立但相关的问题是,在springboot文档上传文件的示例中,https://spring.io/guides/gs/uploading-files/,文件是请求路径的一部分而不是负载。这对我来说似乎很奇怪,所以有没有办法将文件绑定到请求体中?

2个回答

17

我过去处理这个问题的方式是上传两个不同的部分,一个是文件,另一个是相应的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--

很好,感谢您的回答。 - T.W.R. Cole
如何处理List<Bio>? - phancuongviet

7

Andy的方案使用@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

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


2
对于Postman和Curl,我都得到了以下错误信息:{"timestamp":1471958647719,"status":"ERROR","data":"Content type 'application/octet-stream' not supported"} - Kirill
@Derp 对我来说非常好用。非常感谢。 - styssi
我在 Postman 中也收到了“application/octet-stream”不受支持的错误提示。如果将 Foo 更改为 String,则可以正常工作。背后是否使用了转换器来处理 Foo? - user2412398
现在这个对我起作用了,不确定我之前做错了什么。@RequestPart不需要转换器,如Wilson在这里的答案中所述 -https://dev59.com/dloT5IYBdhLWcg3w0B-_ - user2412398

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接