Java Spring引导多部分文件上传作为json主体的一部分

Java Spring引导多部分文件上传作为json主体的一部分,java,rest,file-upload,spring-boot,Java,Rest,File Upload,Spring Boot,我想知道是否有可能有一个post端点可以接受包含多部分文件和其他数据的json负载。e、 g.我的身体对象看起来像: public class Bio { private Long id; private String firstName; private MultipartFile imageFile; } 一个单独但相关的问题是,在springboot文档上载文件的示例中,文件是请求路径的一部分,而不是有效负载。这对我来说似乎很奇怪,那么有没有办法将文件绑定到请求主

我想知道是否有可能有一个post端点可以接受包含多部分文件和其他数据的json负载。e、 g.我的身体对象看起来像:

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

一个单独但相关的问题是,在springboot文档上载文件的示例中,文件是请求路径的一部分,而不是有效负载。这对我来说似乎很奇怪,那么有没有办法将文件绑定到请求主体?

我过去这样做的方式是上传两个单独的部分,一个用于文件,另一个用于附带的JSON。您的控制器方法如下所示:

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--
public void create(@RequestPart(“foo”)foo foo,
@请求部分(“图像”)多部分文件(图像)
// …
}
然后,它将使用如下所示的请求:

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--
内容类型:多部分/混合;边界=6O2KNFSE3P53TY9DMCQVWAIX1ZINP11UCFM
--6O2KNFSE3P53TY9DMCQVWAIX11UCFM
内容配置:表单数据;name=“foo”
内容类型:application/json;字符集=UTF-8
{“a”:“alpha”,“b”:“bravo”}
--6O2KNFSE3P53TY9DMCQVWAIX11UCFM
内容配置:表单数据;name=“image”;filename=“foo.png”
内容类型:应用程序/八位字节流
内容长度:734003
--6O2KNFSE3P53TY9DMCQVWAIX11UCFM--

安迪使用@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

确保转义有效负载内容,并且somevalid.zip应该位于执行curl的同一目录中,或者用文件的有效路径替换它。

Nice。感谢您对postman和curl的回答:
{“timestamp”:1471958647719,“status”:“ERROR”,“data”:“Content type‘application/octet stream’not supported”}
@Derp对我来说非常有用。Thx很多。我也从Postman那里得到“不支持应用程序/八位字节流”,如果Foo被更改为字符串,它就可以工作。后台是否有Foo的转换器?这对我来说现在起作用了,不确定我做错了什么。@RequestPart不需要一个转换器作为Wilson回答中的文档-