MultipartFile
を使用してSpringを使用してファイルをアップロードする、Java設定のWebサービスを実装しようとしています。私は春のブートを使用していないと私のクラスパスにcommons-fileupload
ライブラリがあります。春休みSpring起動のないJava設定のMultiPartファイルアップロード
私が言うの春のドキュメント読み:
あなたはweb.xmlの「マルチパート-config設定」セクションで、またはプログラムサーブレット登録でjavax.servlet.MultipartConfigElementでのDispatcherServletをマークする必要があるのか、サーブレットクラスのjavax.servlet.annotation.MultipartConfigアノテーションを持つカスタムサーブレットクラスの場合...前述のいずれかの方法でサーブレット3.0のマルチパート解析が有効になったら、SpringコンフィグレーションにStandardServletMultipartResolverを追加できます
したがって、私はadde D私のAppConfig
クラスにこのBean:
@Bean
public StandardServletMultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
とMultipartConfig
を持つクラスを注釈付き:
@EnableWebMvc
@MultipartConfig(maxFileSize = 5120)
public class AppConfig extends WebMvcConfigurerAdapter{
...
}
しかし、私がサービスを呼び出すとき、私はこの例外を取得:私が使用している場合
Caused by: org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.UnsupportedOperationException: SRVE8020E: Servlet does not accept multipart request
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:111)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:85)
at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:76)
at org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:112)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:207)
at [internal classes]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:207)
... 1 more
Caused by: java.lang.UnsupportedOperationException: SRVE8020E: Servlet does not accept multipart request
at com.ibm.ws.webcontainer.srt.SRTServletRequest.prepareMultipart(SRTServletRequest.java:3657)
at [internal classes]
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:92)
をStandardServletMultipartResolver
の代わりにCommonsMultipartResolver
と同じエラーが発生します。
これは私が自分のアプリケーションを初期化する方法である:
public class AppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
context.setServletContext(servletContext);
servletContext.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcherServlet", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD);
FilterRegistration.Dynamic characterEncoding = servletContext.addFilter("CharacterEncodingFilter", characterEncodingFilter);
characterEncoding.addMappingForUrlPatterns(dispatcherTypes, true, "/*");
}
}
私もMultipartFilter
が、運とを追加してみました。
MultipartFilter multipartFilter = new MultipartFilter();
FilterRegistration.Dynamic multipart = servletContext.addFilter("multipartFilter", multipartFilter);
multipart.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
これは必要ですか?何が間違っているのですか?私は解決策を探してインターネット全体を読むと思うが、彼らはすべてMultipartConfigElement
とMultipartConfigFactory
で春のブートを使用しています。たぶん、問題は私がサービスを消費する方法ですか?
これは私のコントローラのメソッドです:
@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = "multipart/form-data")
public Long uploadAttachment(@RequestParam("cn") String callerName, @RequestParam("cs") String callerService, @RequestParam("file") MultipartFile file)
、これは私がそれを消費する方法である:
File file = new File("C:\\Users\\cte0289\\Documents\\Email\\document.docx");
RestTemplate rest = new RestTemplate();
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("cn", callerName);
map.add("cs", callerService);
map.add("file", file);
Long response = rest.postForObject(url + "/upload", map, Long.class);
私はやって他に何か分からない助けてください。
'@ MultipartConfig'を追加することは、サーブレット上にあるはずなので、かなり無駄です。ディスパッチャーサーブレットを使用するときは、サーブレットの登録時に取得する登録オブジェクトに 'MultipartConfigElement'を設定する必要があります。代わりに、コモンズファイルアップロードを使用するように切り替えてください。したがって、サーブレットを正しく構成していない限り、サーブレット3.0のアップロードは機能しません(いくつのフィルタを前に置いてください)。 –
この行をAppInitializerクラスの 'dispatcher.setMultipartConfig(新しいMultipartConfigElement(" C:/ tmp "、1024 * 1024 * 5、1024 * 1024 * 5 * 5、1024 * 1024));で' 'MultipartConfigElement 'しかし、私はまだエラーが発生します。これは間違っていますか?あなたに質問すると、私は 'CharacterEncodingFilter'が必要です – amicoderozer
@ M.Deinum私はサービスを消費するために使用している方法が正しいかどうか知っていますか?私はコモンズファイルのアップロードとサーブレット3.0で両方のアプローチを試みましたが、私はそれを動作させることができません。 – amicoderozer