2015-04-07 14 views
5

SFONDOjQuery Ajax upload di file: Richiesto MultipartFile 'file' parametro non è presente

Sto costruendo una primavera applicazione web MVC su Java8 e funzionante su tomcat8. Oltre a queste informazioni, la versione Spring è 4.1.6.RELEASE e Servlet 3.1 Ti sto dando lo sfondo ambientale, perché alcuni risolutori di problemi citati la versione è correlata a questo errore.

MIO CODICE

riportano di seguito le root-context.xml

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

Qui di seguito è il mio 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"); 
     } 
    } 

Qui di seguito è la mia forma

<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> 

cosa strana

è che il caricamento dei file attraverso form submit non ha alcun problema. Esso funziona magicamente !! Non ho nulla di cui lamentarmi per form submit !!

MA QUESTO AJAX SOTTO NON FUNZIONA

  $.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 sto cercando di caricare file con sopra chiamata ajax, il server mi butta questo errore.

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 il browser dice qualcosa di simile ...

<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> 

Il punto è 'file' richiesto MultipartFile parametro non è presente e 400 Richiesta.

Googled con questa parola chiave e cercato, per quanto ho potuto, come faccio sempre prima di pubblicare una domanda sul stackoverflow

Io davvero non capisco perché solo ajax non funziona qui !! quando invia il caricamento funziona bene.

+0

Si utilizza action = "/ uploadFile.json". Questo file è già presente? –

+0

Accertati che 'inputElement.files [0]' non sia nullo – Turtle

+0

@Turtle Di sicuro non è nullo. – hina10531

risposta

5

dare una prova come questa:

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); 
       } 
      }); 
+0

Hey !! Funziona come un fascino ~! settando 'contentType: false' su ajax e inserendo i miei dati di file nell'oggetto' FormData' ho risolto il mio problema ~! Non ho mai pensato di usare 'FormData' Potresti spiegare ulteriormente perché fa funzionare ajax? e perché il mio codice originale non prima? – hina10531

+0

È meglio non impostare il tipo di contenuto manualmente nella richiesta ajax per inviare la richiesta di dati multipart poiché la stringa di confine mancherà nell'intestazione della richiesta e il server sa dove inizia e termina un valore di parametro nel caso di richiesta di dati multipart. –

+0

NON ha funzionato per me, ma questo ha fatto 'fd.append (" file ", $ ('input [tipo = file]') [0]. File [0])' –

Problemi correlati