共计 1722 个字符,预计需要花费 5 分钟才能阅读完成。
-
背景
- 有两个服务,A 服务有一个文件上传的接口,B 服务通过 restTemplate 调用 A 服务的接口上传一个文件。
- B 服务曾经拿到文件内容。那么是否可能在不须要生成临时文件的状况下上传文件到 A 服务呢?
-
实现过程
-
定义内容
String fileStr = "文件内容";
-
字符串转换成 byte[]
byte[] xmlBytes = fileStr.getBytes();
-
自定义 MultipartFile 实现类
public class BASE64DecodedMultipartFile implements MultipartFile { // 上传文件字节流 private final byte[] imgContent; // 上传文件的文件名 private final String originalFilename; public BASE64DecodedMultipartFile(byte[] imgContent, String originalFilename) { this.imgContent = imgContent; this.originalFilename = originalFilename; } @Override public String getName() { // TODO - implementation depends on your requirements return null; } @Override public String getOriginalFilename() { // TODO - implementation depends on your requirements return this.originalFilename; } @Override public String getContentType() { // TODO - implementation depends on your requirements return null; } @Override public boolean isEmpty() {return imgContent == null || imgContent.length == 0;} @Override public long getSize() {return imgContent.length;} @Override public byte[] getBytes() throws IOException {return imgContent;} @Override public InputStream getInputStream() throws IOException {return new ByteArrayInputStream(imgContent); } @Override public void transferTo(File dest) throws IOException, IllegalStateException {new FileOutputStream(dest).write(imgContent); } }
-
结构上传文件对象
MultipartFile mf = new BASE64DecodedMultipartFile(xmlBytes, fileName);
-
通过 restTemplate 调用近程接口
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap<String, Object> requestparams = new LinkedMultiValueMap<>(); requestparams.add("file", mf.getResource()); requestparams.add("filename", mf.getOriginalFilename()); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(requestparams, headers); Object resultVo = restTemplate.postForObject(url, requestEntity, Object.class);
-
正文完