• 背景

    1. 有两个服务,A服务有一个文件上传的接口,B服务通过restTemplate调用A服务的接口上传一个文件。
    2. B服务曾经拿到文件内容。那么是否可能在不须要生成临时文件的状况下上传文件到A服务呢?
  • 实现过程

    1. 定义内容

      String fileStr = "文件内容";
    2. 字符串转换成byte[]

          byte[] xmlBytes = fileStr.getBytes();
    3. 自定义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);    }}
    4. 结构上传文件对象

      MultipartFile mf = new BASE64DecodedMultipartFile(xmlBytes, fileName);
    5. 通过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);