【发布时间】:2013-12-08 08:57:05
【问题描述】:
我正在尝试编写一个 spring mvc 方法,该方法可以接收多部分/表单或传输编码分块文件上传。我可以编写一个单独的方法来处理每种类型,但我想用相同的方法来做,所以我可以使用相同的 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);
}
应该是可以的,有人知道怎么做吗?
谢谢, 史蒂夫
【问题讨论】:
-
你想要一个端点,并且不介意有两个控制器方法吗?或者你想要单个端点和单个控制器方法?
-
如果有办法让 2 个控制器方法使用相同的 URI,并且 spring 可以根据是否存在多部分内容来选择调用哪个方法。
标签: spring-mvc file-upload chunked-encoding multipartform-data