+-
文件上传(不生成临时文件)
首页 专栏 java 文章详情
0

文件上传(不生成临时文件)

求平安 发布于 1 月 25 日

背景

有两个服务,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);
RestTemplate restTemplate = new RestTemplate();
Object resultVo = restTemplate.postForObject(url, requestEntity, Object.class);
java spring springboot
阅读 53 更新于 1 月 25 日
收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar
求平安
1 声望
0 粉丝
关注作者
0 条评论
得票 时间
提交评论
avatar
求平安
1 声望
0 粉丝
关注作者
宣传栏

背景

有两个服务,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);
RestTemplate restTemplate = new RestTemplate();
Object resultVo = restTemplate.postForObject(url, requestEntity, Object.class);