最近在做一個(gè)項(xiàng)目滚停,用Spring boot開發(fā),需要接收微信小程序傳過來的圖片粥惧,壓縮后發(fā)送到影像系統(tǒng)中保存键畴,涉及到上傳文件,現(xiàn)列舉出兩種RestTemplate上傳文件的方案突雪。
1. restTemplate從服務(wù)器文件系統(tǒng)中選文件上傳起惕。
從文件系統(tǒng)上傳文件時(shí),需要把文件轉(zhuǎn)換成FileSystemResource咏删,然后放入HttpEntity中即可惹想。代碼如下:
public UploadImageResponseVO uploadImg(String fileLocal) throws IOException {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
headers.setConnection("Keep-Alive");
headers.setCacheControl("no-cache");
FileSystemResource resource = new FileSystemResource(new File(fileLocal));
HttpEntity<FileSystemResource> httpEntity = new HttpEntity<>(resource);
ResponseEntity<Resource> responseEntity = restTemplate.postForEntity(serverUrl, httpEntity, Resource.class);
//對讀到的內(nèi)容映射成對應(yīng)的實(shí)體類
XmlMapper xmlMapper = new XmlMapper();
UploadImageResponseVO uploadImageResponseVO = xmlMapper.readValue(responseEntity.getBody().getInputStream(), UploadImageResponseVO.class);
logger.debug("responseEntity: {} ", uploadImageResponseVO);
return uploadImageResponseVO;
}
2. restTemplate轉(zhuǎn)發(fā)接收的文件,直接上傳圖片督函。
用multipart形式上傳文件時(shí)嘀粱,需要用到MultiValueMap<String, Object>類,用它裝載文件對象以及multipart的表單數(shù)據(jù)辰狡。
這里涉及到一個(gè)文件锋叨,從request中拿文件往MultiValueMap放時(shí),不能直接request.getFile()給multiValueMap宛篇,這樣在restTemplate上傳文件時(shí)娃磺,messageConverter轉(zhuǎn)化時(shí)會報(bào)錯(cuò),需要把request.getFile("file").getResource()的數(shù)據(jù)給multiValueMap些己。代碼如下:
public UploadResponseVO resendUpload(String url,StandardMultipartHttpServletRequest request) throws IOException {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
parts.add("file",request.getFile("file").getResource());
Enumeration<String> enumeration= request.getParameterNames();
while(enumeration.hasMoreElements()){
String key = enumeration.nextElement();
parts.add(key,request.getParameter(key));
}
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(parts, headers);
ResponseEntity<UploadResponseVO> responseEntity = restTemplate.postForEntity(url,httpEntity,UploadResponseVO.class);
return responseEntity.getBody();
}