0

My Spring Boot 1.5.1 + Commons Fileupload 1.3.2ファイルのアップロード要求のマッピングが、multipart/form-dataで失敗します。 curlSpringブート1.5:ファイルアップロードで「multipart/*」を受け入れる

@RequestMapping(method=RequestMethod.POST, value="/api/users/uploads") 
public @ResponseBody ResponseEntity<?> uploadUsers(
    @RequestParam(value="file", required=true) MultipartFile file 
    ) throws IOException { 
    String uploadFilename = file.getName(); 

    try(InputStream input = file.getInputStream()) { 
     usersConverter.read(input); 
    } 

    return ResponseEntity.ok("Uploaded " + uploadFilename + " successfully."); 
} 

curl -v -u 'username:password' 
    -H "Content-Type: multipart/mixed" 
    -X POST -F [email protected] 
    http://localhost:8080/api/users/uploads 
正常に動作します

:マイリクエストマッピングは次のようになり

* Trying ::1... 
* Connected to localhost (::1) port 8080 (#0) 
* Server auth using Basic with user 'username' 
> POST /api/users/uploads HTTP/1.1 
> Host: localhost:8080 
> Authorization: Basic cGFzc3dvcmQ= 
> User-Agent: curl/7.42.1 
> Content-Length: 8237 
> Expect: 100-continue 
> Content-Type: multipart/mixed; boundary=-------------------4c6cae60d33268be 
> 
< HTTP/1.1 100 Continue 
< HTTP/1.1 200 
< X-Content-Type-Options: nosniff 
< X-XSS-Protection: 1; mode=block 
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
< Pragma: no-cache 
< Expires: 0 
< X-Frame-Options: DENY 
< Set-Cookie: JSESSIONID=8F80A63F1B83982DA1614ADD7BCB6C16;path=/;HttpOnly 
< Content-Type: text/plain;charset=UTF-8 
< Content-Length: 27 
< Date: Thu, 16 Mar 2017 17:39:51 GMT 
< 
* Connection #0 to host localhost left intact 

が、私はmultipart/form-dataの代わりmultipart/mixedを送信するいくつかのクライアントを持っていると私と思いますこのリクエストマッピングのように両方を処理します。私は@RequestMappingに以下を追加しようとしました:

  • consumes="multipart/*"
  • consumes={"multipart/mixed", "multipart/form-data"
  • headers="content-type=multipart/*"
  • headers={"content-type=multipart/mixed", "content-type=multipart/form-data"}

が、それぞれのケースで:

curl -v -u 'username:password' 
    -H "Content-Type: multipart/form-data" 
    -X POST -F [email protected] 
    http://localhost:8080/api/users/uploads 

400で失敗します。multipart/form-dataを送信

* Trying ::1... 
* Connected to localhost (::1) port 8080 (#0) 
* Server auth using Basic with user 'username' 
> POST /api/users/uploads HTTP/1.1 
> Host: localhost:8080 
> Authorization: Basic cGFzc3dvcmQ= 
> User-Agent: curl/7.42.1 
> Content-Length: 8237 
> Expect: 100-continue 
> Content-Type: multipart/form-data; boundary=-------------------85d8a22839d9bc08 
> 
< HTTP/1.1 100 Continue 
< HTTP/1.1 400 
< X-Content-Type-Options: nosniff 
< X-XSS-Protection: 1; mode=block 
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
< Pragma: no-cache 
< Expires: 0 
< X-Frame-Options: DENY 
< Set-Cookie: JSESSIONID=1EB31D866907E49F0972F601E22317D0;path=/;HttpOnly 
< Content-Length: 0 
< Date: Thu, 16 Mar 2017 17:42:00 GMT 
< Connection: close 
< 
* Closing connection 0 

マイ角度2.4クライアントは、(おそらく同じ)400で失敗します。

どのように私はmultipart/form-dataを処理するリクエストマッピングを得ることができますか?

+0

このリンク[spring upload file](https://www.mkyong.com/spring/curl-post-request-examples/)にご確認ください。たぶんあなたのカールは間違っています。 –

+0

@MatejMarconak - 'curl'コマンドが正しいと思われます。これは 'mixed 'で動作しますが、' form-data'では動作しません - それは両者の唯一の違いです。そしてどちらの場合も 'curl'は必要な' boundary'値を追加します。そして、私は 'mixed 'の代わりに' form-data'を提供するnon-'curl'クライアントから同じ' 400'を取得します。 –

+0

400:BAD REQUEST - jsからの呼び出しを試すことができますか?春の定義はOKです。 –

答えて

0

ええ、それはバグです。その後、あまりにも、期待通りの要求のマッピングがmultipart/mixedmultipart/form-dataの両方のために働く...そして私の角度クライアントが動作

/* 
    @Bean(name = "multipartResolver") 
    public CommonsMultipartResolver multipartResolver() { 
     CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 
     multipartResolver.setMaxUploadSize(100000); 

     return multipartResolver; 
    } 
    */ 

commons-fileuploadcommons-io依存関係を削除します。

<!-- 
    <dependency> 
    <groupId>commons-fileupload</groupId> 
    <artifactId>commons-fileupload</artifactId> 
    <version>1.3.2</version> 
    </dependency> 

    <dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4</version> 
    </dependency> 
    --> 

をしてmultipartResolver Bean定義を削除します。

関連する問題