我正在尝试编写一个Spring MVC方法,可以接收multipart/form或transfer-encoding分块文件上传。我可以编写单独的方法来处理每种类型,但我希望使用同一方法来实现,以便可以使用相同的REST POST uri,例如:
我尝试编写一个Spring MVC方法,该方法可以接收multipart/form或transfer-encoding分块文件上传。虽然我可以编写两个不同的方法来处理这两种类型的上传,但我希望能够使用同一个方法。这样,我就可以使用相同的REST POST uri,例如:
http://host:8084/attachments/testupload
这是我目前为止的最佳尝试:
@RequestMapping(value = { "/testupload" }, method = RequestMethod.POST, produces =
"application/json")
public @ResponseBody
ResponseEntity<MessageResponseModel> testUpload(
@RequestParam(value = "filedata", required = false) MultipartFile filedata,
final HttpServletRequest request) throws IOException {
InputStream is = null;
if (filedata == null) {
is = request.getInputStream();
}
else {
is = filedata.getInputStream();
}
byte[] bytes = IOUtils.toByteArray(is);
System.out.println("read " + bytes.length + " bytes.");
return new ResponseEntity<MessageResponseModel>(null, null, HttpStatus.OK);
}
使用上述方法可以上传多部分文件,但如果我上传分块文件,Spring会抛出异常,提示如下:org.springframework.web.multipart.MultipartException: \
The current request is not a multipart request
如果我删除MultipartFile请求参数,它可以很好地处理分块传输编码。如果我保留它,它可以很好地处理MultipartFile上传。如何使用同一方法处理这两种上传类型?这适用于分块传输编码:
@RequestMapping(value = { "/testupload" }, method = RequestMethod.POST, produces =
"application/json")
public @ResponseBody
ResponseEntity<MessageResponseModel> testUpload(
final HttpServletRequest request) throws IOException {
InputStream is = null;
is = request.getInputStream();
byte[] bytes = IOUtils.toByteArray(is);
System.out.println("read " + bytes.length + " bytes.");
return new ResponseEntity<MessageResponseModel>(null, null, HttpStatus.OK);
}
对于 MultipartFile 来说,这个方法非常好用:
@RequestMapping(value = { "/testupload" }, method = RequestMethod.POST, produces =
"application/json")
public @ResponseBody
ResponseEntity<MessageResponseModel> testUpload(
@RequestParam MultipartFile filedata) throws IOException {
InputStream is = null;
is = filedata.getInputStream();
byte[] bytes = IOUtils.toByteArray(is);
System.out.println("read " + bytes.length + " bytes.");
return new ResponseEntity<MessageResponseModel>(null, null, HttpStatus.OK);
}
这应该是可行的,有人知道怎么做吗?
谢谢,Steve