2015-10-16 48 views
0

我知道這已經討論了很多次,我在Google/Stackoverflow上搜索了很多,但似乎無法讓它工作。彈簧 - 休息模板 - 使用文件輸入流和其他原始數據上傳文件

我有一個Spring MVC Web應用程序,JSP發送媒體文件和一些文本字段,控制器捕獲輸入流和其他表單數據(一些文本字段),並創建一個類型爲FileUploadRequest的POJO對象。完整的數據(文件+文本字段)必須原樣傳遞給另一個服務(第三方服務)進行上傳。

我正在使用Spring REST模板連接到第三方服務。以下是在代碼段:

RestTemplate初始化(爪哇配置)

@Bean 
public ClientHttpRequestFactory httpRequestFactory() { 
    final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient()); 
    requestFactory.setBufferRequestBody(false); 
    return requestFactory; 
} 

@Bean 
public RestTemplate getRestTemplate() { 
    final RestTemplate restTemplate = new RestTemplate(); 
    restTemplate.setRequestFactory(httpRequestFactory()); // apache http library 
    restTemplate.setMessageConverters(getMessageConverters()); 
} 


private List<HttpMessageConverter<?>> getMessageConverters() { 
    final List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(); 
    final FormHttpMessageConverter e = new FormHttpMessageConverter(); 
    e.addPartConverter(new MappingJackson2HttpMessageConverter()); 
    converters.add(e); 
    return converters; 
} 

@Bean 
public CommonsMultipartResolver multipartResolver() { 
    final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); 
    return commonsMultipartResolver; 
} 

控制器代碼:

public APPResponse uploadFile(final HttpServletRequest request) { 
    final FileUploadRequest uploadRequest = new FileUploadRequest(); 
    final List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); 
    for (final FileItem item : items) { 
     if (item.isFormField()) { 
      String fieldValue = item.getString(); 
      uploadRequest.setEnabled(Boolean.valueOf(fieldValue)); 
     } else { 
      String fileName = FilenameUtils.getName(item.getName()); 
      InputStream fileContent = item.getInputStream(); 
      uploadRequest.setFileName(fileName); 
      uploadRequest.setFileStream(fileContent); 
     } 
    } 
    uploadFileToService(uploadRequest); 
} 

POJO類:

public class FileUploadRequest { 
    private String fileName; 
    private InputStream fileStream; 
    private boolean enabled; 
    // getter setters... 
} 

uploadFileToService方法實現

public FileUploadResponse uploadFileToService(final FileUploadRequest uploadRequest) { 
    final HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.MULTIPART_FORM_DATA); 

    final String url = <URL where the file is to passed as is>; 
    MultiValueMap<String, Object> parameters = new LinkedMultiValueMap<String, Object>(); 
    parameters.set("Content-Type","multipart/form-data"); 
    parameters.add("file", uploadRequest.getFileStream()); 
    parameters.add("someOtherParam", uploadRequest.isEnabled()); 

    final HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(
      parameters, headers); 
    final ResponseEntity<T> exchange = template.exchange(url, 
       HttpMethod.POST, httpEntity, FileUploadResponse.class); 
} 

現在,當我跑我的申請,我得到以下錯誤:

Caused by: java.lang.UnsupportedOperationException: getBody not supported at org.springframework.http.client.HttpComponentsStreamingClientHttpRequest.getBodyInternal(HttpComponentsStreamingClientHttpRequest.java:84) at org.springframework.http.client.AbstractClientHttpRequest.getBody(AbstractClientHttpRequest.java:47) at org.springframework.http.converter.FormHttpMessageConverter.writeMultipart(FormHttpMessageConverter.java:299) at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:238) at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:87) at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:777) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:566) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:529) at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:447)

請讓我知道它是什麼,我的思念,我無法弄清楚這個問題。

如果需要進一步的細節,我可以分享

謝謝!

回答

0

所以,看起來像我解決了它。這個問題是由於Spring 4.1.1發行版上的一個錯誤。它在4.2.0中得到解決 將pom依賴改爲使用4.2.0,現在它工作正常。

0

使用Spring Web的MultipartFile,然後在控制器中使用@RequestParam("file") MultipartFile file作爲參數。然後,您將可以訪問該流以及上傳時附帶的所有其他屬性。

+0

這是否會有所作爲,我的意思是在控制器中使用MultipartFile只會刪除控制器中的某些代碼(其中表單字段正在從請求中檢索並設置爲POJO)。我的理解是否正確,或者需要進行其他更改? – kaps