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

Posted

技术标签:

【中文标题】Spring boot Multipart文件上传作为json正文的一部分【英文标题】:Spring boot Multipart file upload as part of json body 【发布时间】:2015-03-26 14:03:08 【问题描述】:

我想知道是否有可能有一个可以接受包含多部分文件以及其他数据的 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】:

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 的同一目录中,或者将其替换为文件的有效路径。

【讨论】:

对于邮递员和 curl 我得到:"timestamp":1471958647719,"status":"ERROR","data":"Content type 'application/octet-stream' not supported" @Derp 对我来说就像一个魅力。非常感谢。 我也从 Postman 得到“应用程序/八位字节流”不支持”,如果 Foo 更改为 String 它可以工作。是否有用于 Foo 幕后的转换器? 这对我有用,不知道我做错了什么。 @RequestPart 在 Wilson 的回答中不需要转换器作为文档 - ***.com/questions/38156646/…

以上是关于Spring boot Multipart文件上传作为json正文的一部分的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 文件上传 文件过大 FileUploadBase$SizeLimitExceed

Spring Boot文件上传

Spring Boot 控制器 - 将 Multipart 和 JSON 上传到 DTO

Spring Boot怎么处理上传文件时出现的MultipartException

spring boot application.properties 配置参数详情

如何在 Spring Boot 中更改 Multipart 文件的最大大小?