Upload de arquivo jQuery Ajax: O parâmetro MultipartFile obrigatório 'file' não está presente
FUNDO
Estou criando um aplicativo Web Spring MVC no Java8 e executando-o no tomcat8. Além dessas informações, a versão Spring é4.1.6.RELEASE
eServlet 3.1
Estou fornecendo os antecedentes ambientais, porque alguns solucionadores de problemas mencionaram que a versão está relacionada a esse erro.
MEU CÓDIGO
Abaixo está oroot-context.xml
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="20000000" />
</bean>
Abaixo está o meuFileController
@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");
}
}
Abaixo está o meu formulário
<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>
COISA ESTRANHA
é que o upload de arquivos atravésform submit
não tem problema. Ele funciona como um encanto !! Não tenho do que reclamarform submit
!!
MAS ESTE AJAX ABAIXO NÃO FUNCIONA
$.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);
}
});
Quando estou tentando fazer upload de arquivo com a chamada ajax acima, o servidor me lança esse erro.
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
E o navegador diz algo como ...
<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>
O ponto éO parâmetro MultipartFile obrigatório 'file' não está presente e400 Solicitação incorreta.
Pesquisei essa palavra-chave no Google e pesquisei o máximo que pude, como sempre faço antes de postar uma pergunta emstackoverflow
Eu realmente não entendo porque apenasajax
não funciona aqui !! quando enviar o upload funciona muito bem.