2017-02-13 80 views
1

spring restTemplateを使用してRestControllerにMultipartFileのリストを投稿しようとしていますが、正確な構文については少し混乱しています。&私のクライアント&コントローラ。ここで私は今のところ...私がやった研究にSpring 4でマルチパートファイルのリストをアップロードするrestTemplate(Java Client&RestController)

FileUploadClient.java

public void uploadFiles(List<MultipartFile> multiPartFileList) throws IOException { 
    MultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); 
    List<Object> files = new ArrayList<>(); 
    for(MultipartFile file : multiPartFileList) { 
     files.add(new ByteArrayResource(file.getBytes())); 
    } 
    map.put("files", files); 

    // headers is inherited from BaseClient 
    headers.setContentType(MediaType.MULTIPART_FORM_DATA); 
    HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map, headers); 
    ResponseEntity<String> response = restTemplate.exchange(restURI + "/rest/fileupload/uploadfiles", HttpMethod.POST, request, String.class); 
    if(HttpStatus.OK.equals(response.getStatusCode())) { 
     System.out.println("status for /rest/fileupload/uploadfiles ---> " + response); 
    } 
} 

FileUploadRestController.java

@RequestMapping(value = "/uploadfiles", method = RequestMethod.POST) 
public ResponseEntity<?> uploadFiles(@RequestParam("files") List<MultipartFile> files, HttpServletRequest request) { 
    ResponseEntity<?> response; 
    try { 
     // do stuff... 
     response = new ResponseEntity<>(header, HttpStatus.OK); 
     System.out.println("file uploaded"); 
    } catch (Exception e) { 
     // handle exception 
    } 
    return response; 
} 

のweb.xmlをベースとしているものです

<filter> 
    <filter-name>multipartFilter</filter-name> 
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>multipartFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

春-servlet.xml私はそれを正しく理解していれば

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
    <!-- max upload size in bytes --> 
    <property name="maxUploadSize" value="20971520" /> <!-- 20MB --> 
    <!-- max size of file in memory (in bytes) --> 
    <property name="maxInMemorySize" value="1048576" /> <!-- 1MB --> 
</bean> 

。マルチパートフィルタは、私のMultiValueMapをList of MultipartFilesとMultipartHttpServletRequestに解析する必要がありますか? クライアントにRestControllerを命中させる唯一の方法は、ファイルデータをByteArrayResourceとして送信することですが、私のコントローラでは、私のRequestBodyは常にnullで、MultipartHttpServletRequestはmultipartFiles属性の空のマップを持っています。私は、この問題を解決しようとするために多くの投稿を見てきましたが、役に立たなかったのです。どんな助けでも大歓迎です。

答えて

4

FileUploadClientから送信しているrequestペイロードが、サーバーが期待しているものと一致していないようです。あなたは次のことを変更してみてくださいでした:

MultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); 
List<ByteArrayResource> files = new ArrayList<>(); 
for(MultipartFile file : multiPartFileList) { 
    files.add(new ByteArrayResource(file.getBytes())); 
} 
map.put("files", files); 

MultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); 
for(MultipartFile file : multiPartFileList) { 
    map.add(file.getName(), new ByteArrayResource(file.getBytes())); 
} 

また、あなたは以下に、サーバーのメソッドのシグネチャを変更してみてください:

public ResponseEntity<?> uploadFiles(@RequestParam("files") List<MultipartFile> files, HttpServletRequest request) { 

更新

複数のファイルをアップロードする際には、 getFileNameByteArrayResourceであることを確認するたびに同じ値が返されます。そうでない場合は、空の配列が常に得られます。

など。私にとっては、次の作品:

クライアント:私はそれらの変更を行った場合

MultiValueMap<String, Object> data = new LinkedMultiValueMap<String, Object>(); 
for(MultipartFile file : multiPartFileList) { 
    ByteArrayResource resource = new ByteArrayResource(file.getBytes()) { 
     @Override 
     public String getFilename() { 
      return ""; 
     } 
    }; 
    data.add("files", resource); 
} 

Serverが

public ResponseEntity<?> upload(@RequestParam("files") MultipartFile[] files){ 
+0

、私の残りのコントローラは、もはやヒットなかっなりました。コントローラの中でクライアントと '@RequestParam(" files ")List files = new ArrayList <>();'に変更したとき、 mはファイルのバイト数です。 – Steve

+0

私はその地図にも注意する必要があります。put( "ファイル"、ファイル); 'Map >型のput(String、List )メソッドのput(String、List )メソッドは引数には適用できないので、' map.add "ファイル"、ファイル); 'オブジェクトに変更すると、putを使用できます。 – Steve

+0

ええ、それはいいです。 'List 'を 'List 'に変更できますか? –

関連する問題