2014-11-20 6 views
24

Sto cercando di incorporare più funzionalità di caricamento file nella mia applicazione web Angular utilizzando angular-file-upload. Attualmente, la funzionalità di front-end funziona, ma ogni tentativo di upload genera una eccezioneCaricamento file Spring - Aspettandosi MultipartHttpServletRequest: è configurato un MultipartResolver? error

java.lang.IllegalStateException,java.io.IOException]: 
    java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: 
     is a MultipartResolver configured? 

.

La Carica di controllo è definito come

@Controller 
@PropertySource("classpath:application.properties") 
public class FileUploadController { 

    @Resource 
    private Environment env; 

    @RequestMapping(value = "/fileupload", method = RequestMethod.POST) 
    @ResponseBody 
    public List<String> fileUpload(@RequestParam("file") MultipartFile[] uploadFiles) throws IllegalStateException, IOException { 
     //file processing logic 
    } 
} 

Nella mia classe AppConfig.java, dichiaro il fagiolo

@Bean 
public CommonsMultipartResolver commonsMultipartResolver(){ 
    CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); 
    commonsMultipartResolver.setDefaultEncoding("utf-8"); 
    commonsMultipartResolver.setMaxUploadSize(50000000); 
    return commonsMultipartResolver; 
} 

e avviare l'applicazione web con

@Override 
public void onStartup(ServletContext servletContext) throws ServletException { 

    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
    ctx.register(AppConfig.class); 
    servletContext.addListener(new ContextLoaderListener(ctx)); 

    ctx.setServletContext(servletContext); 
    ctx.refresh(); 

    Dynamic servlet = servletContext.addServlet(SERVLET_NAME, new DispatcherServlet(ctx)); 
    servlet.addMapping("/"); 
    servlet.setLoadOnStartup(1); 
    //servlet.setMultipartConfig(ctx.getBean(MultipartConfigElement.class)); 
} 

Non credo è dovuto alla mancanza di un elemento <form> nella mia Angula r vista, perché posso vedere che Content-Tyle è multipart/form-data e che il carico utile della richiesta è impostato in modo appropriato.

Remote Address:192.168.33.10:80 
Request URL:http://dev.jason.com/rest/fileupload 
Request Method:POST 
Status Code:500 Internal Server Error 
Request Headers 
    Accept:*/* 
    Accept-Encoding:gzip,deflate 
    Accept-Language:en-US,en;q=0.8 
    Cache-Control:no-cache 
    Connection:keep-alive 
    Content-Length:415235 
    Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryBHlsldPQysTVpvwZ 
    Host:dev.jason.com 
    Origin:http://dev.jason.com 
    Pragma:no-cache 
    Referer:http://dev.jason.com/ 
    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 
Request Payload 
    ------WebKitFormBoundaryBHlsldPQysTVpvwZ 
    Content-Disposition: form-data; name="file"; filename="IMG_5072.jpg" 
    Content-Type: image/jpeg 

    ------WebKitFormBoundaryBHlsldPQysTVpvwZ-- 

Si noti che questo problema si verifica ancora quando compresi

@Bean 
public MultipartConfigElement multipartConfigElement(){ 
    MultipartConfigFactory multipartConfigFactory = new MultipartConfigFactory(); 
    multipartConfigFactory.setMaxFileSize("10MB"); 
    multipartConfigFactory.setMaxRequestSize("50MB"); 
    return multipartConfigFactory.createMultipartConfig(); 
} 

in AppConfig.java e decommentando il comando

servlet.setMultipartConfig(ctx.getBean(MultipartConfigElement.class)); 

nella mia classe servlet di inizializzazione.

Qualsiasi aiuto è apprezzato!

+0

Per uno, non si registra il contesto 'ctx' sia con il' ContextLoaderListener' e il 'DispatcherServlet'. –

+0

Qual è il motivo dietro questo? – Jason

+0

http://stackoverflow.com/questions/11708967/che-è-la differenza- tra-applicationcontext-and-webapplicationcontext-in-s –

risposta

29

Lo stack MVC di Spring richiede che il bean MultipartResolver sia chiamato multipartResolver. Cambiare il metodo @Bean a

@Bean 
public CommonsMultipartResolver multipartResolver(){ 

o

@Bean(name = "multipartResolver") 
public CommonsMultipartResolver commonsMultipartResolver(){ 
+0

Una soluzione così semplice per un problema frustrante. Grazie! – Jason

+0

@Jason Quello che mi infastidisce è che, oltre al codice sorgente, non c'è documentazione che lo specifichi. Gli esempi forniti nei documenti usano semplicemente 'multipartResolver' ma non rendono chiaro (almeno non quello che ho letto) che il nome deve essere' multipartResolver'. –

+0

D'accordo, anche se avrei dovuto prenderlo. Quasi tutti gli esempi che ho cercato di aiuto avevano la configurazione XML con ' ...' – Jason

4

Basta aggiungere questo per servler-context.xml

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

Nient'altro necessario.

+0

La soluzione più semplice! Grazie. –

-1

si deve aggiungere in webmvc-context.xml questo:

<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"/> 
Problemi correlati