2017-01-13 36 views
0

残りのWebサービスを呼び出してファイルをアップロードしたいと思います。 このWebサービスには、MultipartFileが必要です。春のMultipartファイルアップロードRestTemplateとJackson

私はこれを行うことができ、ここで読む:だからMultipart File Upload Using Spring Rest Template + Spring Web MVC

を、ここに私のコードは次のとおりです。

public Document uploadDocument(MultipartFile file) { 
     UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(backendURL + "documents/upload"); 
     URI uri = builder.build().encode().toUri(); 

     LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); 
     map.add("file", file); 

     HttpHeaders headers = new HttpHeaders(); 
     headers.setContentType(MediaType.MULTIPART_FORM_DATA); 
     HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = 
       new HttpEntity<LinkedMultiValueMap<String, Object>>(map, headers); 

     try { 
      ResponseEntity<Document> responseEntity = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, Document.class); 
     } catch (Exception e) { 
      e.getMessage(); // Crash here 
     } 

     return document.getBody(); 
    } 

ジャクソンはJSONでファイルをシリアル化しようとするが、それは次のエラーで失敗します。

Could not write content: No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)) (through reference chain: org.springframework.web.multipart.support.StandardMultipartFile["inputStream"]->java.io.FileInputStream["fd"]) 

ファイルのjsonシリアル化を無効にするにはどうすればよいですか?

+1

http://stackoverflow.com/questions/22630550/tunneling-multipartfileあなたにこれが動作しているようです –

+0

を助けるかもしれない:ここでは

は動作するコードです。ありがとう。 いくつかのテストの後、機能コードの回答を追加します。 – YLombardi

答えて

2

Jekin Kalariyaのおかげで、実用的な解決策が見つかりました。

私はMultipartFileから一時ファイルを作成し、これを使用してFileSystemResourceを作成します。 MultipartFileの代わりにこのFileSystemResourceを送信します。

public DocumentDetailed uploadDocumentInIfs(MultipartFile file, String userProfile) { 
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(backendURL + "documents/upload"); 
    builder.queryParam("user", userProfile); 
    URI uri = builder.build().encode().toUri(); 

    File tempFile = null; 
    try { 
     String extension = "." + getFileExtention(file.getOriginalFilename()); 
     tempFile = File.createTempFile("temp", extension); 
     file.transferTo(tempFile); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); 
    map.add("file", new FileSystemResource(tempFile)); 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.MULTIPART_FORM_DATA); 
    HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<>(map, headers); 

    Document document = null; 
    try { 
     ResponseEntity<Document> responseEntity = 
       restTemplate.exchange(uri, HttpMethod.POST, requestEntity, Document.class); 
     document = responseEntity.getBody(); 
    } catch (Exception e) { 
     e.getMessage(); 
    } 

    return document; 
} 
関連する問題