【发布时间】:2019-03-31 00:12:12
【问题描述】:
我想使用 curl 在控制器中一起传递 json 和文件。我在控制器中有以下方法。
@PostMapping(value = /api/campaign, headers = {"content-type=multipart/mixed","content-type=multipart/form-data"})
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public @Valid ResponseDTO campaignCreator (@Valid @RequestBody CampaignCreatorDTO campaignCreatorDTO, @RequestPart("file") MultipartFile adGraphic){
}
下面是 curl 命令
curl -i -X POST -H "Content-Type: multipart/mixed" -d "campaignCreatorDTO={\"edipi\":123456789,\"firstName\":\"John\",\"lastName\":\"Smith\",\"email\":\"john.smith@gmail.com\"};type=application/json" -F "file=@newfile.png;type=image/png" http://localhost:8080/api/campaign
控制器方法没有被调用。 当我将 json 放入文件中并在 curl 命令中使用 file 代替直接 json 时,它可以工作。 但我不想将文件用于 json。
我尝试将 @RequestPart 用于 json 对象但同样的问题。
有没有办法在 json 中传递多部分文件,我的意思是 CampaignCreatorDTO 对象?
更新:: 现在我可以为这两种类型传递 RequestPart,但图像大小将变为 0 字节。虽然 iamge 存在于文件系统中。
更新代码:: 现在使用下面的代码,并将文件大小设为 0 字节。
@PostMapping(value = /api/campaign, consumes = {"multipart/form-data","multipart/mixed"})
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public @Valid ResponseDTO campaignCreator (@Valid @RequestPart("json") CampaignCreatorDTO campaignCreatorDTO, @RequestPart("file") MultipartFile adGraphic) {
}
我尝试了此链接中给出的解决方案,但仍然是同样的问题
Spring MVC Multipart Request with JSON
这是客户端向服务器发送数据的方式
let formData = new FormData()
const blob = new Blob([json], {
type: 'application/json'
});
formData.append("json", blob)
formData.append("file", values.adCreativeImageCover)
let authToken = sessionStorage.getItem("authToken")
fetch(/api/campaign, {
method: "POST",
headers: {
'Accept': 'application/json',
'X-Auth-Token': authToken,
},
mode: 'cors',
body: formData
})
【问题讨论】:
-
您的请求不能同时是
multipart/form-data和application/json。您可以使用两个请求来完成,也可以使用请求参数发送 json -
你只需要将你的 json 编码(到 URL 兼容的格式,例如 URL 编码)或你的文件(到 base64 字符串之类的东西)并在服务器上解码
-
@SumeshTG 做同样的事情,但文件大小仍然为 0 字节。
-
@Anjali 您的请求正文应该有 formData 而不是 JSON。
标签: spring spring-mvc spring-boot curl