2015-09-29 9 views
6

私は現在、Springブートv1.3.0.BUILD-SNAPSHOT、Spring v4.2.2.BUILD-SNAPSHOTで動作しています。Spring Boot + Multipartファイルをアップロードするとフォーマットが不適切なマルチパートリクエストが返される

私は(角度経由)複数ファイルのアップロードを実行しようとすると:

myService.upload = function(name ,content) { 
    var fd = new FormData(); 
    fd.append('name', name); 
    fd.append('file', content); 

    return $http({ 
     method: 'POST', 
     url: SERVER_BASE_URL + 'upload', 
     data: fd, 
     transformRequest: angular.identity, 
     headers: { 
     'Content-Type': 'multipart/form-data' 
     }}).then(function(res) {  
     return res.headers('Location'); 
     }, function(reason) { 
      throw reason; 
     }); 
}; 

私はエラーを取得する:

[WARN] org.eclipse.jetty.server.Request - java.io.IOException: Missing initial multi part boundary at org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:507) ~[jetty-util-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:400) ~[jetty-util-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.Request.getParts(Request.java:2139) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.Request.extractMultipartParameters(Request.java:385) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:308) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.Request.extractParameters(Request.java:256) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.Request.getParameter(Request.java:825) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:70) [spring-web-4.2.2.BUILD-SNAPSHOT.jar:4.2.2.BUILD-SNAPSHOT] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.2.BUILD-SNAPSHOT.jar:4.2.2.BUILD-SNAPSHOT] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [jetty-servlet-9.2.13.v20150730.jar:9.2.13.v20150730] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) [spring-web-4.2.2.BUILD-SNAPSHOT.jar:4.2.2.BUILD-SNAPSHOT] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.2.BUILD-SNAPSHOT.jar:4.2.2.BUILD-SNAPSHOT] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [jetty-servlet-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.ja [jetty-servlet-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) [jetty-security-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) [jetty-servlet-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.Server.handle(Server.java:499) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) [jetty-server-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) [jetty-io-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) [jetty-util-9.2.13.v20150730.jar:9.2.13.v20150730] at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) [jetty-util-9.2.13.v20150730.jar:9.2.13.30]1507 at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]

私は、マルチパートリゾルバBeanを追加しました:

@Bean 
public FilterRegistrationBean openEntityManagerFilterRegistrationBean() { 
    // Set upload filter 
    final MultipartFilter multipartFilter = new MultipartFilter(); 
    final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(multipartFilter); 
    filterRegistrationBean.addInitParameter("multipartResolverBeanName", "commonsMultipartResolver"); 

    return filterRegistrationBean; 
} 

@Bean 
public CommonsMultipartResolver commonsMultipartResolver() { 
    final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); 
    commonsMultipartResolver.setMaxUploadSize(-1); 

    return commonsMultipartResolver; 
} 

しかし、マルチパートリゾルバの前にhiddenHttpMethodFilterが呼び出されているようです:

[DEBUG] org.eclipse.jetty.servlet.ServletHandler - call filter characterEncodingFilter [DEBUG] org.eclipse.jetty.servlet.ServletHandler - call filter hiddenHttpMethodFilter [WARN] org.eclipse.jetty.util.MultiPartInputStreamParser - Badly formatted multipart request

私のBeanに@Order(0)を追加しようとしましたが効果がありませんでした。

他に何が欠けていますか?

+0

フォームを作成してコンテンツタイプを設定しても、マルチパートフォーム送信であるとは限りません。単純にフォームを作成して提出するのはなぜですか... –

+0

解決策はありますか? –

+0

工具でテストしていますか?あなたがそれをいくつかのデータと共に送るなら、それは失敗するかもしれません。ファイルだけを送信してみてください。また、モジュールを使ってファイルをアップロードすることをお勧めします。私は同じ問題を抱えていた –

答えて

1

私はファイルをアップロードするためにフィルタを使用しません。

ここでこの方法を試してみてください:

// in configs 
  @Bean 
     Public MultipartConfigElement multipartConfigElement() { 
         End MultipartConfigFactory factory = new MultipartConfigFactory(); 
         Factory.setMaxFileSize ("50MB"); 
         Factory.setMaxRequestSize ("50MB"); 
         Return factory.createMultipartConfig(); 
     } 

 // in controller 
     @RequestMapping (value = "/ sendfile", method = RequestMethod.POST) 
         Public ModelAndView formSubmit (@RequestParam ("file") MultipartFile file) { 

     } 

注:私はまあ

0

を助けることを願ってい

あなたはコンフィグに入れてフィルタを削除することを忘れないでくださいこれはあなたの角度のjsコードに問題があることを意味します。 ブラウザでデバッグする必要があります。正確には何が送信されているのですか。ヘッダーがありません。火かき棒のようなツールを使用してください。このコードを試してください。

var fd = new FormData(); 
fd.append('file', file); 
fd.append('data', 'string'); 
$http.post(uploadUrl, fd, { 
    transformRequest: angular.identity, 
    headers: {'Content-Type': undefined} 
}) 
.success(function(){ 
}) 
.error(function(){ 
}); 

絶対に不可欠configオブジェクトの次の2つのプロパティは以下のとおりです。

transformRequest: angular.identity 

はそのまま我々のデータを残して、角度のデフォルトの直列化を優先します。

headers: {'Content-Type': undefined } 

ブラウザがマルチパート/フォームデータとして正しいのContent-Typeを検出し、正しい境界に記入することができます。

関連する問題