[英]Multipart file upload with spring RestTemplate and Jackson
我想通過調用rest網絡服務來上傳文件。 該Web服務需要一個MultipartFile。
我在這里閱讀可以執行以下操作: 使用Spring Rest模板+ 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();
}
Jackson嘗試以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序列化?
感謝Jekin Kalariya,我找到了一個可行的解決方案。
我從MultipartFile創建一個臨時文件,並使用它來創建FileSystemResource。 我發送此FileSystemResource而不是MultipartFile。
這是工作代碼:
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.