2014-11-20 5 views
24

Próbuję włączyć wiele funkcji przesyłania plików w mojej aplikacji internetowej Angular przy użyciu angular-file-upload. Obecnie funkcjonalność interfejsu frontowego działa, ale każda próba przesyłania powoduje odrzucenie wyjątku od Przesyłanie plików wiosennych - oczekiwanie MultipartHttpServletRequest: czy skonfigurowano MultipartResolver? error

Upload Kontroler jest zdefiniowany jako

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

W moim AppConfig.java klasy oświadczam, fasoli

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

i uruchomić aplikację internetową z

@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)); 
} 

nie sądzę jest to spowodowane brakiem elementu <form> w mojej Anguli r view, ponieważ widzę, że Content-Tyle jest ustawiona i że żądanie ładunku jest ustawione odpowiednio.

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

Zauważ, że ten problem wciąż występuje, gdy w tym

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

w AppConfig.java i odkomentowanie Komenda

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

w mojej klasie apletu inicjatora.

Każda pomoc jest doceniana!

+0

dla jednego, nie zarejestruje 'ctx' kontekst zarówno z' ContextLoaderListener' i 'DispatcherServlet'. –

+0

Jaki jest tego powód? – Jason

+0

http://stackoverflow.com/questions/11708967/what-is-the-difference-between-applicationcontext-and-webapplicationcontext-in-s –

Odpowiedz

29

Wiosny stos MVC wymaga, aby fasola MultipartResolver była nazywana multipartResolver. Zmienić metodę @Bean do

@Bean 
public CommonsMultipartResolver multipartResolver(){ 

lub

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

Takie proste rozwiązanie frustrującego problemu. Dzięki! – Jason

+0

@Jason To, co robię, polega na tym, że poza kodem źródłowym nie ma dokumentacji określającej to. Przykłady podane w dokumentach po prostu używają 'multiartResolver', ale nie wyjaśniają (przynajmniej nie to, co przeczytałem), że nazwa musi być' multipartResolver'. –

+0

Zgadzam się, chociaż powinienem był to złapać. Prawie wszystkie przykłady, których szukałem, zawierały konfigurację XML z ' ...' – Jason

4

Wystarczy dodać do servler-context.xml

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

nic innego potrzebne.

+0

Najprostszym rozwiązaniem! Dzięki. –

-1

Trzeba dodać w webmvc-context.xml tym:

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