我想知道是否有可能接受包含多部分文件以及其他数据的json有效负载的post端点。例如我的身体对象看起来像:
public class Bio {
private Long id;
private String firstName;
private MultipartFile imageFile;
}
一个单独但相关的问题是,在springboot doc示例中,用于上传文件https://spring.io/guides/gs/uploading-files/,该文件是请求路径的一部分而不是有效负载。这对我来说很奇怪,有没有办法让文件绑定到请求体?
答案 0 :(得分:16)
我过去做过这种方式的方法是上传两个单独的部分,一个用于文件,另一个用于随附的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--
答案 1 :(得分:7)
Andy使用@RequestPart的解决方案完美无缺。但是不能用邮递员验证,因为它似乎不支持,指定每个多部分的内容类型以正确设置边界,如他的答案所述。
所以要使用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
确保您转义有效负载内容,somevalid.zip应该在执行curl的同一目录中,或者用文件的有效路径替换它。