如何在Spring MVC中同时使用多部分/表单和分块编码来接收文件上传?

我正在尝试编写一个可以接收multipart / form或传输编码的分块文件上传的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);

}

应该有可能,有人知道该怎么做吗?

谢谢史蒂夫

回答:

我的代码节选(Spring 3.2,使用AngularJS上传blueimp文件):

/**

* Handles chunked file upload, when file exceeds defined chunked size.

*

* This method is also called by modern browsers and IE >= 10

*/

@RequestMapping(value = "/content-files/upload/", method = RequestMethod.POST, headers = "content-type!=multipart/form-data")

@ResponseBody

public UploadedFile uploadChunked(

final HttpServletRequest request,

final HttpServletResponse response) {

request.getHeader("content-range");//Content-Range:bytes 737280-819199/845769

request.getHeader("content-length"); //845769

request.getHeader("content-disposition"); // Content-Disposition:attachment; filename="Screenshot%20from%202012-12-19%2017:28:01.png"

request.getInputStream(); //actual content.

//Regex for content range: Pattern.compile("bytes ([0-9]+)-([0-9]+)/([0-9]+)");

//Regex for filename: Pattern.compile("(?<=filename=\").*?(?=\")");

//return whatever you want to json

return new UploadedFile();

}

/**

* Default Multipart file upload. This method should be invoked only by those that do not

* support chunked upload.

*

* If browser supports chunked upload, and file is smaller than chunk, it will invoke

* uploadChunked() method instead.

*

* This is instead a fallback method for IE <=9

*/

@RequestMapping(value = "/content-files/upload/", method = RequestMethod.POST, headers = "content-type=multipart/form-data")

@ResponseBody

public HttpEntity<UploadedFile> uploadMultipart(

final HttpServletRequest request,

final HttpServletResponse response,

@RequestParam("file") final MultipartFile multiPart) {

//handle regular MultipartFile

// IE <=9 offers to save file, if it is returned as json, so set content type to plain.

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.TEXT_PLAIN);

return new HttpEntity<>(new UploadedFile(), headers);

}

这应该使您入门。在IE8,IE9,IE10,Chrome,FF上进行的最低测试。当然可能存在问题,并且可能有一种提取内容范围的简便方法,但是..对我有用。

以上是 如何在Spring MVC中同时使用多部分/表单和分块编码来接收文件上传? 的全部内容, 来源链接: utcz.com/qa/409875.html

回到顶部