JQuery Ajax file upload: Required MultipartFile parameter 'file' parameter missing

BACKGROUND

I am building a Spring MVC web application in Java8 and running it on tomcat8. In addition to this information, Spring version 4.1.6.RELEASE and Servlet 3.1 I give you an environmental background, because some problem solvers mentioned the version associated with this error.

MY CODE

Below root-context.xml

 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="20000000" /> </bean> 

Below is my FileController

 @Controller public class FileController { private static final Logger logger = LoggerFactory.getLogger(FileController.class); private static final String UploadFolder = "Files"; @RequestMapping("/uploadFile") @ResponseBody public void uploadFile(@RequestParam("file") MultipartFile file, HttpServletResponse response) throws IOException { String fileName = ""; PrintWriter script = response.getWriter(); if (!file.isEmpty()) { try { byte[] bytes = file.getBytes(); fileName = FilenameUtils.getName(file.getOriginalFilename()); String extension = FilenameUtils.getExtension(fileName); String base = System.getProperty("catalina.home"); File dir = new File(base + File.separator + UploadFolder); if (!dir.exists()) { dir.mkdirs(); } Date date = new Date(); String year = DateTimeUtility.getInstance().getYear(date); String month = DateTimeUtility.getInstance().getMonth(date); String uniqueFileName = DateTimeUtility.getInstance().getDateTime(date); File dateDir = new File(base + File.separator + UploadFolder + File.separator + year + File.separator + month); if (!dateDir.exists()) { dateDir.mkdirs(); } File uploadedFile = new File(dateDir.getAbsolutePath() + File.separator + uniqueFileName + WordCollections.UNDERBAR + fileName); BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(uploadedFile)); stream.write(bytes); stream.close(); logger.info("Server File Location = " + uploadedFile.getAbsolutePath()); script.write("Uploading file was successful"); } catch (Exception e) { logger.error("Server failed to upload this file : " + fileName); script.write("Uploading file was failed"); } } else { logger.error("The requested file is empty"); script.write("Uploading file was empty"); } } 

Below is my form

 <form id="upload" method="POST" action="/uploadFile.json" enctype="multipart/form-data"> File to upload: <input type="file" name="file" onchange="MyScript.uploadFile(this);"><br /> <input type="submit" value="Upload"> Press here to upload the file! </form> 

STRANGE THING

is that there are no problems uploading files via form submit . Works great !! I have nothing to complain about form submit !!

BUT THIS HAYAK DOES NOT WORK BELOW

  $.ajax({ type: "POST", url: "/uploadFile", data: {name: "file", file: inputElement.files[0]}, contentType: 'multipart/form-data;boundary=----WebKitFormBoundary0XBBar2mAFEE8zbv', processData: false, cache: false, /*beforeSend: function(xhr, settings) { xhr.setRequestHeader("Content-Type", "multipart/form-data;boundary=gc0p4Jq0M2Yt08jU534c0p"); settings.data = {name: "file", file: inputElement.files[0]}; },*/ success: function (result) { if ( result.reseponseInfo == "SUCCESS" ) { } else { } }, error: function (result) { console.log(result.responseText); } }); 

When I try to download the file with the above ajax call, the server gives me this error.

 2015-04-07 18:37:30 DEBUG: org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'appServlet' processing POST request for [/uploadFile] 2015-04-07 18:37:30 DEBUG: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Looking up handler method for path /uploadFile 2015-04-07 18:37:30 DEBUG: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Returning handler method [public void com.company.web.controller.FileController.uploadFile(org.springframework.web.multipart.MultipartFile,javax.servlet.http.HttpServletResponse) throws java.io.IOException] 2015-04-07 18:37:30 DEBUG: org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'fileController' 2015-04-07 18:37:30 DEBUG: org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Resolving exception from handler [public void com.company.web.controller.FileController.uploadFile(org.springframework.web.multipart.MultipartFile,javax.servlet.http.HttpServletResponse) throws java.io.IOException]: org.springframework.web.bind.MissingServletRequestParameterException: Required MultipartFile parameter 'file' is not present 2015-04-07 18:37:30 DEBUG: org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [public void com.company.web.controller.FileController.uploadFile(org.springframework.web.multipart.MultipartFile,javax.servlet.http.HttpServletResponse) throws java.io.IOException]: org.springframework.web.bind.MissingServletRequestParameterException: Required MultipartFile parameter 'file' is not present 2015-04-07 18:37:30 DEBUG: org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [public void com.company.web.controller.FileController.uploadFile(org.springframework.web.multipart.MultipartFile,javax.servlet.http.HttpServletResponse) throws java.io.IOException]: org.springframework.web.bind.MissingServletRequestParameterException: Required MultipartFile parameter 'file' is not present 2015-04-07 18:37:30 DEBUG: org.springframework.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'appServlet': assuming HandlerAdapter completed request handling 2015-04-07 18:37:30 DEBUG: org.springframework.web.servlet.DispatcherServlet - Successfully completed request 

And the browser says something like ...

 <body><h1>HTTP Status 400 - Required MultipartFile parameter 'file' is not present</h1><div class="line"></div><p><b>type</b> Status report</p><p><b>message</b> <u>Required MultipartFile parameter 'file' is not present</u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect.</u></p><hr class="line"><h3>Apache Tomcat/8.0.20</h3></body></html> 

Point The required File parameter of the MultipartFile parameter is missing and 400 Bad Request .

I searched this keyword and searched as much as I could, as always, before posting a stackoverflow question

I really don't understand why only ajax doesn't work here !! when sending downloadable works just fine.

+5
source share
2 answers

Try it like this:

 var fd = new FormData(); fd.append( "file", $("input[name=file]").files[0]); $.ajax({ type: "POST", url: "/uploadFile", data: fd, contentType: false, processData: false, cache: false, /*beforeSend: function(xhr, settings) { xhr.setRequestHeader("Content-Type", "multipart/form-data;boundary=gc0p4Jq0M2Yt08jU534c0p"); settings.data = {name: "file", file: inputElement.files[0]}; },*/ success: function (result) { if ( result.reseponseInfo == "SUCCESS" ) { } else { } }, error: function (result) { console.log(result.responseText); } }); 
+5
source

For those who can’t find a suitable solution, do not forget to add a thymeleaf dependency to your project

For instance;

 compile("org.springframework.boot:spring-boot-starter-thymeleaf") 
0
source

All Articles