2016-08-01 26 views
0

私は何を試してもこれを理解できないようです。Spring Boot + multipart/form-dataコントローラメソッド

@RequestMapping(consumes = {"multipart/form-data"}, method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}, path = {"/rest", "/rest/**"}) 
public void handleMultipartRestApiRequest(MultipartHttpServletRequest request, HttpServletResponse response, @RequestPart(value = "filedata", required = false) MultipartFile filedata) throws Exception { 
    r... 
} 

filedataに変数は常にnullである、とリクエストオブジェクト:私は次のような方法で注釈を付け@RestControllerと春ブーツ1.4アプリを持っている

curl -v -F name=countries.zip -F [email protected] http://localhost:8080/rest 

:私はこのcurlコマンドを送信しています常に0個のファイルを表示します。

私はMultipartResolverで複数の設定を試しました。

multipart.enabled=true 

spring.http.multipart.enabled =真

@Bean 
public MultipartResolver multipartResolver() { 
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 
    multipartResolver.setMaxUploadSize(5000000); 
    multipartResolver.setMaxInMemorySize(5000000); 
    multipartResolver.setDefaultEncoding("utf-8"); 
    return multipartResolver; 
} 

私は手動でも、私のapplication.propertiesでこれらを突っ込んはちょうどそれが無効になっていない1000%確認する:ここでは私の最新のものです

と良い測定のために、ここにいるリクエストヘッダ:

* Connected to localhost (::1) port 8080 (#0) 
> POST /rest HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.43.0 
> Accept: */* 
> Content-Length: 817999 
> Expect: 100-continue 
> Content-Type: multipart/form-data; boundary=------------------------7d3f4606455e862b 
> 

誰もが手掛かり理由を持っています私はコントローラ上のファイルを見ることができないようですか?

UPDATE 1:

私がリクエストオブジェクトに十分掘るとorg.catalina.connector.Requestオブジェクトを取得する場合、情報を保持しているようだDiskFileItemが含まれているApplicationPartアイテムのArrayListのがありますアップロードしようとしているファイルこれは実際にはrequest.getParts()を呼び出したときに返されるCollectionです。ファイル項目の場所のパスは、いくつかの長いTMPパスである:それはまた、コンテンツタイプがアプリケーション/オクテットストリームであると言いますが

/private/var/folders/n8/15d6vbhj0692cslf3cx8c1jm0000gn/T/tomcat.6840182548028446450.8080/work/Tomcat/localhost/myapp 

、サイズが-1され、そして「isFormField」のようないくつかの他のすごみは、さえ偽であります私はそれを私のカールコマンドのフォームフィールドとして指定していますが。だから、春はマルチパート/フォームデータ要求を扱う正しい方法を呼んでいますが、 "部分"情報はそれがオクテットストリームだと思えるようです。

+0

私は多分あなたのマルチパートオブジェクトをインスタンス化していないと思います。同様に:MultipartFile filedata = fileToBeAdded.getSomething(); –

+0

あなたは何を意味するのかわかりません...私は要求のファイルを期待しています。私がMap map = request.getFileMap();のようなことをすると、マップは空です。 – Bal

+0

'@ RequestPart'の代わりに' @ RequestParam'を試してください。 –

答えて

-1

MultipartFileを使用してファイルをアップロードする機能を共有しますが、リゾルバやBeanは必要ありませんが、別の種類のパラメータや本体ではなく、ファイルのみを送信できます。

@RequestMapping(value = "/updatePhoto", method = RequestMethod.POST) 
public @ResponseBody 
    ResponseEntity<?> updateUsuario(@RequestParam("file") MultipartFile file, 
     OAuth2Authentication authentication) { 
    try { 
     User user = (User) authentication.getPrincipal(); 
     Usuarios u = usuariosDAO.findUsuarioByUsername(user.getUsername()); 
     if (file.getName().isEmpty() == false) { 
      InputStream inputStream = file.getInputStream(); 
      ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
      int nRead; 
      byte[] bytes = new byte[16384]; 
      while ((nRead = inputStream.read(bytes, 0, bytes.length)) != -1) { 
       buffer.write(bytes, 0, nRead); 
      } 
      buffer.flush(); 
      u.setImagen(buffer.toByteArray()); 
      usuariosDAO.updateUsuario(u); 
     } 
    } catch (Exception e) { 
     return new ResponseEntity<>(HttpStatus.BAD_REQUEST); 
    } 
    return new ResponseEntity<>(HttpStatus.OK); 
} 

この場合、プロフィールユーザーの写真をアップロードし、それをバイトの配列に変換します。その後、データベースに保存されます。これがあなたを助けてくれることを願っています

+0

ありがとうPaulo - しかし、私の問題は、MultipartFile変数は常にnullで、私は理由を理解できないようです。 – Bal