Angular angular-file-upload を使用してWebアプリケーションに複数のファイルアップロード機能を組み込むことを試みています。現在、フロントエンド機能は動作しますが、各アップロード試行投げる
Java.lang.IllegalStateException,Java.io.IOException]:
Java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest:
is a MultipartResolver configured?
例外。
Upload Controllerは次のように定義されます
@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
}
}
AppConfig.Java
クラスで、Beanを宣言します
@Bean
public CommonsMultipartResolver commonsMultipartResolver(){
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
commonsMultipartResolver.setDefaultEncoding("utf-8");
commonsMultipartResolver.setMaxUploadSize(50000000);
return commonsMultipartResolver;
}
そして、Webアプリケーションを起動します
@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));
}
Angularビューに<form>
要素がないため、Content-Tyle
はmultipart/form-data
であり、要求ペイロードが適切に設定されます。
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--
この問題は、
@Bean
public MultipartConfigElement multipartConfigElement(){
MultipartConfigFactory multipartConfigFactory = new MultipartConfigFactory();
multipartConfigFactory.setMaxFileSize("10MB");
multipartConfigFactory.setMaxRequestSize("50MB");
return multipartConfigFactory.createMultipartConfig();
}
AppConfig.Java
でコマンドのコメントを外します
servlet.setMultipartConfig(ctx.getBean(MultipartConfigElement.class));
私のサーブレット初期化クラス。
どんな助けも大歓迎です!
SpringのMVCスタックでは、MultipartResolver
BeanをmultipartResolver
と呼ぶ必要があります。 @Bean
メソッドを変更します
@Bean
public CommonsMultipartResolver multipartResolver(){
または
@Bean(name = "multipartResolver")
public CommonsMultipartResolver commonsMultipartResolver(){
これをservlet-context.xmlに追加するだけです
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="268435456"/>
</bean>
他に何も必要ありません。