web-dev-qa-db-ja.com

SPRING REST:マルチパート境界が見つからなかったため、リクエストは拒否されました

春3休憩マルチパートファイルアップロードのPOCを行いました。うまく動作します。しかし、アプリケーションと統合しようとしたときに問題に直面しています。

次の例外をスローします。

org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request;
nested exception is org.Apache.commons.fileupload.FileUploadException:
the request was rejected because no multipart boundary was found**"

私のコードのどこかが間違っているかどうかを教えてください。

豆:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
 <property name="order" value="1" />
 <property name="mediaTypes">
 <map>
   <entry key="json" value="application/json" />
   <entry key="xml" value="application/xml" />
   <entry key="file" value="multipart/mixed" />
 </map>
</property>
</bean>
<!-- multipart resolver -->
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <!-- one of the properties available; the maximum file size in bytes -->
  <property name="maxUploadSize" value="50000000" />
 </bean>

コントローラ:

@Controller
public class MultipleFilesRecieve {
    @RequestMapping ( value = "/saveMultiple", method = RequestMethod.POST )
        public String save( FileUploadForm uploadForm ) {
        List<MultipartFile> files = uploadForm.getFiles( );
        List<String> fileNames = new ArrayList<String>( );
        if ( null != files && files.size( ) > 0 ) {
            for ( MultipartFile multipartFile : files ) {
                String fileName = multipartFile.getOriginalFilename( );
                fileNames.add( fileName );
            }
        }
        return "multifileSuccess";
    }
}
28
Cherry

問題はコードにあるのではなく、リクエストにある。マルチパートリクエストに境界がありません。 仕様 で述べたように:

マルチパートエンティティのContent-Typeフィールドには、カプセル化境界を指定するために使用される1つのパラメーター "boundary"が必要です。カプセル化境界は、2つのハイフン文字(「-」、10進コード45)の後に、Content-Typeヘッダーフィールドの境界パラメーター値が続く行として定義されます。

This および this の投稿も役立つはずです。

32
sermolaev

@sermolaevが正解です。

この問題に関する私の経験を共有したいと思います。 Postmanでこの問題に遭遇しましたが、その根本原因を長い間理解できませんでした。 Postmanがboundaryを含んでいるので、私のリクエストテンプレートは正しいようです...

最終的に、自分でContent-Type=multipart/formヘッダーを指定すると、Postmanによって自動的に追加されたヘッダーが上書きされることを発見しました。そして、これはあなたと同じエラーにつながります。私の解決策は、Content-Typeヘッダーを削除するのと同じくらい簡単でした。

3
naXa

リクエストにContent-Typeヘッダーを指定しないでください。それが動作します。

0
Ankit Rai

セキュリティフィルターを使用していますか?私の問題は、セキュリティフィルターチェーンを削除することで解決しました。これから:

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).addFilters(this.springSecurityFilterChain).build();

これに:

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();

詳細を説明する問題を開きました: https://jira.spring.io/browse/SPR-12114

0
unify