Spring MVC和多部分处理

我正在使用
Spring MVC 4,我有一个带有以下映射/方法的控制器:

@RequestMapping(value = "/me/bio", method = RequestMethod.POST, consumes = { "multipart/form-data" })
@ResponseBody
public JsonResponse<Boolean> saveProfileBio1(Account account, @RequestPart("file") MultipartFile file, @RequestPart("profile") @Valid ProfileBio profileBio) throws ValidationException, IOException {
...//code here
}

当我提交多部分表单数据请求时,它失败,出现HTTP 400错误请求,错误为“org.springframework.web.multipart.support.MissingS ervletRequestPartException:所需的请求部分’配置文件’不存在”

以下是原始请求:

------WebKitFormBoundarynU961NKt3K534rCg
Content-Disposition: form-data; name="profile"
{"profileName":"Zack Smith","profileDescription":"xxx","profileWebLink" :"www.abc","profilePictureUrl":"https://s3.amazonaws.com/xxx-images/default.png","profileTitle":"CTO1"}
------WebKitFormBoundarynU961NKt3K534rCg
Content-Disposition: form-data; name="file"; filename="2013-11-16 21.19.59.jpg"
Content-Type: image/jpeg 

如您所见,请求明确具有“配置文件”部分.从我的调试,问题是“配置文件”请求部分没有“Content-type”设置,DefaultMultipartHttpServletRequest具有以下方法,需要设置它,如果它返回null,整个请求失败,上面的错误.

@Override
public HttpHeaders getMultipartHeaders(String paramOrFileName) {
String contentType = getMultipartContentType(paramOrFileName);
if (contentType != null) {
 HttpHeaders headers = new HttpHeaders();
 headers.add(CONTENT_TYPE, contentType);
 return headers;
}
else {
 return null;
}
}

麻烦的是,我似乎找不到在浏览器中为每个部分设置FormData提交的内容类型的方法,似乎是我无法设置的东西,而Spring似乎需要它.

有关如何解决这个问题或者这是一个错误的任何提示?

谢谢

最佳答案 我看到两个解决问题的方法:

>在客户端上:将JSON作为Blob添加到FormData,如here所述.背景:Blob允许设置内容类型(带角度js的示例):

var formData = new FormData();
formData.append('profile', new Blob([angular.toJson(profile)], {
  type: "application/json"}
));

> Alternativly在服务器上(不推荐):覆盖DefaultMultipartHttpServletRequest的getMultipartHeaders方法并在spring中配置它.如果您正在使用CommonsMultipartResolver,您也需要覆盖它(由于缺少依赖注入点):

new DefaultMultipartHttpServletRequest() {

    @Override
    public HttpHeaders getMultipartHeaders(String paramOrFileName) {
        // your code here
    }
}
点赞