2016-02-01 1 views
2

Je suis en train d'envoyer l'image par ajax:Demande d'image en ajax au printemps contrôleur mvc

function putImage() { 
    var image = document.getElementById('image').files[0]; 
    var formData = new FormData(); 
    formData.append('image', image); 
    $.ajax({ 
     url: 'http://localhost:8080/ImageStorageREST/image', 
     type: 'put', 
     data: formData, 
     contentType: false, 
     processData: false, 
     async: true, 
     success: function(data) { 
      console.log("success"); 
      console.log(data); 
     }, 
     error: function(data) { 
      console.log("error"); 
      console.log(data); 
     } 
    }); 
} 

formulaire HTML:

<form> 
<input type="file" multiple accept="image/*,image/jpeg" id="image"/> 
<input type="submit" value="Отправить" onClick="putImage(); return false;" /> 
</form> 

méthode du contrôleur:

@RequestMapping(value="/image", method=RequestMethod.PUT) 
public @ResponseBody String addImage(@RequestPart("image") MultipartFile image) { 
    return "RECEIVED"; 
} 

Multipart Resolver est enregistré dans le fichier de configuration du répartiteur:

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

J'ai reçu org.springframework.beans.BeanInstantiationException au serveur

org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.multipart.MultipartFile]: Specified class is an interface 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:775) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:368) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:172) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:879) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:620) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Unknown Source) 

et l'état de la demande est

Request URL:http://localhost:8080/ImageStorageREST/image 
Request Method:PUT 
Status Code:500 Internal Server Error 
Remote Address:[::1]:8080 

Mais je vois le paramètre au navigateur:

Content-Disposition: form-data; name="image"; filename="format_jpg.jpg" 
Content-Type: image/jpeg 

...... 

Alors pourquoi cette exception jeté? J'ai regardé beaucoup de liens où la solution était d'ajouter multipartResolver haricot, mais je l'ai encore.

+0

avez-vous essayé de mettre 'enctype = "multipart/form-data"' en vous former? –

+0

Copie possible http://stackoverflow.com/questions/14101558/file-upload-to-server-directory-using-spring-mvc –

+0

oui, ça n'a pas aidé @ ViltérPanitz –

Répondre

0

Ce problème était dû à l'utilisation de Servlet 2.5 (Tomcat 6.0). La classe HttpServletRequest ne contient pas la méthode getParts(). Je résolu mon problème en changeant la méthode de commande:

@RequestMapping(value="/image", method=RequestMethod.PUT, consumes="multipart/form-data") 
public @ResponseBody void addImage(HttpServletRequest request) throws ImageException { 
    byte[] bytes = getBytesFromFile(request); 
    Image image = new Image(); 
    image.setByteData(bytes); 
    imageService.addImage(image); 
} 

private byte[] getBytesFromFile(HttpServletRequest request) throws ImageException { 
    ServletFileUpload upload = new ServletFileUpload(); 
    byte[] bytes = null; 
    FileItemIterator iter; 
    try { 
     iter = upload.getItemIterator(request); 
     while(iter.hasNext()) { 
      FileItemStream item = iter.next(); 
      InputStream stream = item.openStream(); 
      bytes = IOUtils.toByteArray(stream); 
     } 
     return bytes; 
    } catch (IOException | FileUploadException e) { 
     throw new ImageException("The problem while storing file. Try again.",e); 
    } 
}