'Uploading large files via Zuul
I've faced a problem uploading big files through zuul. I'm using apache-commons file upload(https://commons.apache.org/proper/commons-fileupload/) to stream large files as well as I use zuul on the front. In my Spring Boot application I have disabled upload provided by Spring to use the one from apache commons:
spring:
http:
multipart:
enabled: false
Controller looks like that:
public ResponseEntity insertFile(@PathVariable Long profileId,
HttpServletRequest request) throws Exception {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator uploadItemIterator = upload.getItemIterator(request);
if (!uploadItemIterator.hasNext()) {
throw new FileUploadException("FileItemIterator was empty");
}
while (uploadItemIterator.hasNext()) {
FileItemStream fileItemStream = uploadItemIterator.next();
if (fileItemStream.isFormField()) {
continue;
}
//do stuff
}
return new ResponseEntity(HttpStatus.OK);
}
If I access my application directly(without zuul), file upload works as intended. However, if it's accessed through zuul, FileItemIterator doesn't have items to traverse and request finishes with error immediately(ERR_CONNECTION_RESET). For zuul I have also disabled multipart given by Spring. Otherwise, it works. However, the files are not streamed. They are loaded completely and only after I get inside the controller(regular Spring behavior). Is there a way to use apache-commons streaming options with zuul?
Solution 1:[1]
I've found a solution. It's basically described here:
http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_uploading_files_through_zuul
What I did to make it work. Just step by step:
- To bypass the Spring DispatcherServlet I changed the URL:
From: http://localhost:8081/MyService/file
To: http://localhost:8081/zuul/MyService/file
Preserved disabling of Spring multipart upload:
spring: http: multipart: enabled: false
The following header is not required. Transfer-Encoding: chunked
I tried to upload a large file without that one and it was fine.
Solution 2:[2]
I have found solution as described below. In my case the requirement is to allow upto 30MB. Adding below Spring Servlet mulitpart configuration helped as I noticed the error is thrown from embeded tomcat. Note that the request size should be slightly more than the max-file-size as the request will have additional parameters like headers with token etc. In our case I have to add additional 2MB for the max-request-size to allow headers etc.
spring: servlet: multipart: max-file-size: 30MB max-request-size:32MB
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 |
