Spring启动Multipart文件上传作为json正文的一部分

时间:2015-01-27 20:20:15

标签: java rest file-upload spring-boot

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

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

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

2 个答案:

答案 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的同一目录中,或者用文件的有效路径替换它。