HTTP Status 500 – Internal Server Error while uploading multipart/form-data - ajax

I am getting error when i uploading 20 MB Size of csv file in Spring MVC by using CommonsMultipartResolver library. I have done following setting in Config File :
#Bean(name = "filterMultipartResolver")
public CommonsMultipartResolver multipartResolver() throws IOException {
logger.info("CommonsMultipartResolver Set!!");
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxInMemorySize(600 * 1024 * 1024);
multipartResolver.setMaxUploadSizePerFile(100*1024 * 1024);
multipartResolver.setMaxUploadSize(600 * 1024 * 1024);
return multipartResolver;
}
Controller :
#RequestMapping(value = "/FileUploadModel", method = { RequestMethod.POST, RequestMethod.GET })
public #ResponseBody String fileuploadInObjectStorage(#RequestParam(value = "jobType", required = false) String jobType,
#RequestParam(value = "scheduleRule", required = false) String scheduleRule,
#RequestParam(value = "automationRule", required = false) String automationRule,
#RequestParam(value = "importDateFormat", required = true) String importDateFormat,
#RequestParam(value = "file", required = false) MultipartFile[] multiFile1,
#RequestParam(value = "companyName2", required = true) String company,
#RequestParam(value = "className2", required = true) String className,
HttpServletRequest request,HttpSession session) throws Exception {...}
Ajax Call:
$.ajax({
url: contextPath+'/FileUploadModel',
type: "POST",
data: formData,
enctype: 'multipart/form-data',
processData: false,
contentType: false,
timeout:0,
beforeSend: function() {
$("#scheduleRuleDiv,#automationRuleDiv,#JSDateFormatDiv,#JSUploadfileDiv,#uploadGobtnDiv,#uploadFiles").hide();
$.blockUI({
fadeIn: 1000,
message:msg1
});
},
But I am not understanding what is issue. I tried to set up size and setting header also enctype="multipart/form-data", but yet not resolved.
Given below are error:
HTTP Status 500 – Internal Server Error
Type Exception Report
Message Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. java.net.SocketTimeoutException
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. java.net.SocketTimeoutException
org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:165)
org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:142)
org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:112)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
Root Cause
org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. java.net.SocketTimeoutException
org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:351)
org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)
org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:158)
org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:142)
org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:112)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
Root Cause
org.apache.catalina.connector.ClientAbortException: java.net.SocketTimeoutException
org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:322)
org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:600)
org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:340)
org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:132)
java.io.FilterInputStream.read(FilterInputStream.java:133)
org.apache.commons.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:134)
org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:999)
org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:903)
java.io.InputStream.read(InputStream.java:101)
org.apache.commons.fileupload.util.Streams.copy(Streams.java:100)
org.apache.commons.fileupload.util.Streams.copy(Streams.java:70)
org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:347)
org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)
org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:158)
org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:142)
org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:112)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
Root Cause
java.net.SocketTimeoutException
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1290)
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1207)
org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:805)
org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:42)
org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1172)
org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:101)
org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:249)
org.apache.coyote.Request.doRead(Request.java:640)
org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:317)
org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:600)
org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:340)
org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:132)
java.io.FilterInputStream.read(FilterInputStream.java:133)
org.apache.commons.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:134)
org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:999)
org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:903)
java.io.InputStream.read(InputStream.java:101)
org.apache.commons.fileupload.util.Streams.copy(Streams.java:100)
org.apache.commons.fileupload.util.Streams.copy(Streams.java:70)
org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:347)
org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)
org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:158)
org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:142)
org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:112)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
Note The full stack trace of the root cause is available in the server logs.
Apache Tomcat/9.0.50
NOTE : same code is working fine on IBM Liberty server for 99mb file.

you can see SocketTimeOut in tomcat's error log.
maybe increasing server's connectionTimeout resolve the error.
check this Spring boot java.net.SocketTimeoutException while uploading large files

Related

Required request part 'uploadFile' is not present for SpringRestController with two parameters MockMvc

i'am trying to test my Rest Controller which signature is :
#PostMapping(value = "/add", consumes = "multipart/form-data")
#RoleAdministrateur
public ResponseEntity<Object> addThing(#RequestParam("uploadFile") MultipartFile file, #RequestParam("comment") String comment)
here is My moCkMvc test :
File fichier = new File(cheminFichier);
MockMultipartFile part1 = new MockMultipartFile("uploadFile", file, MediaType.TEXT_PLAIN_VALUE, FileUtils.readFileToByteArray(fichier));
byte[] json = "{\"comment\":param}".getBytes(StandardCharsets.UTF_8);
MockMultipartFile jsonPart = new MockMultipartFile("comment", "json", "application/json", json);
resultat = mockMvc.perform(
multipart(url)
.file(part1)
.file(jsonPart)
.contentType(MediaType.MULTIPART_FORM_DATA)
but i have the following error message
Required request part 'uploadFile' is not present
http error code : 400
`

File-upload fails when called via a service i.e restTemplate.postForEntity

I have below springboot rest end point to upload files.
#RequestMapping(
method = RequestMethod.POST,
value = "/v1/file-upload",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Response> uploadFile (
#RequestParam(value = "multipartFile") MultipartFile multipartFile) throws IOException {
String str = storeFile(multipartFile);
return new ResponseEntity<>(new Response("successfully uploaded with name "+str), HttpStatus.OK);
}
and properties as below
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=30MB
this API when called via postman, working fine.
but when called via restTemplate from a service, it's throwing
{"timestamp":"2020-05-26T09:17:46.369+0000","status":500,"error":"Internal Server Error","message":"Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: The field multipartFile exceeds its maximum permitted size of 1048576 bytes.","path":"/43c0800d-b992-45b6-8d25-9e81115539d0/Form/files/mock/api/v1/file-upload"}
exception.
my service calls as below
apiCallResponseObj = restClientUtil.postEntity(serviceUrl, Object.class, apiEndPoint.getFormData(), headers);
apiEndPoint.getFormData() has the multipart file data.
my question is, why am I getting an exception when called via a service?
using springboot 2.1.13
the issue was with api-gateway (kong) where the limitations were put.
the configurations given in the question works fine.

Configuring spring.http.multipart.max-file-size ignores size or returns stream closed

I have a spring-boot application version 1.3.3.RELEASE running Spring 4.2.5.RELEASE
Below I have some of the items I have tried to resolve this. My questions:
Do I need to define my own multipart resolver?
Why is Spring/Tomcat not picking up my multipart settings?
I am trying to accept Multipart files over 1MB. I have configured what appears to be the appropriate config
# Spring http settings
spring.http.multipart.max-file-size=11MB
spring.http.multipart.max-request-size=11MB
Unfortunately this does not seem to have any affect:
org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException:
The field files exceeds its maximum permitted size of 1048576 bytes.
It doesn't seem to be making it past Tomcat at this point. After a little research I tried to add my own multipart resolver.
#Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(10 * 1024 * 1024);
multipartResolver.setMaxUploadSizePerFile(10 * 1024 * 1024);
return new CommonsMultipartResolver();
}
This returns a new error of which has me stumped:
Request processing failed; nested exception is
org.springframework.web.multipart.MultipartException: Could not parse
multipart servlet request; nested exception is
org.apache.commons.fileupload.FileUploadException: Stream closed
My request looks like this:
curl -X POST \
/application/75dc9981-61ac-4fa0-b316-790b764230a3/pending \
-H 'cache-control: no-cache' \
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F files=#/Users/paulscoder/Documents/sticky_phalcon_header.gif
And my Request mapping looks like this:
#RequestMapping(
value = "/application/{applicationId}/pending",
method = POST)
public ResponseEntity<?> uploadFiles(
#PathVariable("applicationId") UUID applicationId,
#RequestParam(value = "docId", required = false) String docId,
#RequestParam(value = "type", required = false) String type,
#RequestParam(value = "files") MultipartFile[] files) throws Exception {...

Upgrading to Tomcat 8 breaks MultipartFile upload

I'm using Spring Boot. The method I'm calling in my controller looks like this:
#RequestMapping(value = "/{customerId}/files/{id}/addFile", method = RequestMethod.POST,
produces = "application/json; charset=UTF-8")
#ResponseBody
public Response uploadFile(#PathVariable String customerId, #PathVariable String id,
#RequestParam("uploadedFile") MultipartFile file) throws IOException {
After upgrading to Tomcat 8 I'm getting the following error when calling this method. I set a breakpoint on the first line which is never reached.:
org.springframework.web.util.NestedServletException: Request
processing failed; nested exception is
org.springframework.web.multipart.MultipartException: Could not parse
multipart servlet request; nested exception is java.io.IOException:
org.apache.tomcat.util.http.fileupload.FileUploadException: Stream
closed
Has anyone come across this issue?
Try to add multipart.maxFileSize and multipart.maxRequestSize to your application.properties file. SpringBoot seems to has a default value of 128KB, which broke my upload.

HTTP Status 404 Spring rest The requested resource is not available

I am using spring 3.2.2.RELEASE and have a problem on sending request to server :
http://asdsda:8080/spr-mvc-hib/user/userHizmet.html?userId=19
HTTP Status 404 The requested resource is not available.
#RequestMapping(value = "/userHizmet/{userId}", method = RequestMethod.GET)
public ModelAndView userHizmet(#PathVariable String userId)
{
ModelAndView mav = new ModelAndView("userte");
where i called :
success: function (data) {
alert(data);
window.location.href="${pageContext. request. contextPath}/user/userHizmet.html?userId="+data;
},
dispatcher :
Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
servlet.addMapping("/");
localhost:8080/spr-mvc-hib/user/userHizmet.html?userId=19
removing .html and using requestparam solved my problem

Resources