1、上传的文件是File类型

如果文件保存在本地,即可以通过File file = new File(path) 或者 文件路径地址获取到指定文件

public String uploadFile(File file) {
// 1、封装请求头
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("multipart/form-data");
headers.setContentType(type);
headers.setContentLength(file.length());
headers.setContentDispositionFormData("media", file.getName());
// 2、封装请求体
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
FileSystemResource resource = new FileSystemResource(file);
param.add("file", resource);
// 3、封装整个请求报文
HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<>(param, headers);
// 4、发送请求
ResponseEntity<String> data = restTemplate.postForEntity(tempMaterialUploadUrl, formEntity, String.class);
// 5、请求结果处理
JSONObject weChatResult = JSONObject.parseObject(data.getBody());
return weChatResult;
}

这种方式可直接将File文件或者文件路径传递给FileSystemResource资源对象。然后将该资源放入请求体中。

2、上传的文件是InputStream流

如果文件不存在本地,而是在阿里云OSS或者其他只能够通过URL获取文件流,并且不想将文件存到本地而直接通过restTemplate发送,则可以使用下面方式。

例子:在工作中用到这个例子:我将系统上传的附件通过阿里云API上传至阿里云OSS,紧接着要讲文件存到企业微信服务器,而且系统服务器不存储任何附件,就用到了下面的方式,通过阿里云API将上传的附件A通过InputStream形式获取到,然后向企业微信服务端上传该输入流即可。

public String uploadInputStream(InputStream inputStream,String fileName,long cententLength) {
// 1、封装请求头
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("multipart/form-data");
headers.setContentType(type);
headers.setContentDispositionFormData("media", fileName);
// 2、封装请求体
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
InputStreamResource resource = new InputStreamResource(inputStream){
@Override
public long contentLength(){
return cententLength;
}
@Override
public String getFilename(){
return fileName;
}
};
param.add("file", resource);
// 3、封装整个请求报文
HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<>(param, headers);
// 4、发送请求
ResponseEntity<String> data = restTemplate.postForEntity(tempMaterialUploadUrl, formEntity, String.class);
// 5、请求结果处理
JSONObject weChatResult = JSONObject.parseObject(data.getBody());
// 6、返回结果
return weChatResult;
}

在需要输入流进行上传文件时,需要使用InputStreamResource构建资源文件,注意要重写contentLength() 和 getFilename()方法,否则不成功。至于参数中的fileNamecontentLength要提前通过文件的URL获取到,因为我是从阿里云OSS读取的文件,所以直接能够获取到文件的大小和文件名。

3、上传的是MultipartFile类型文件

有时候我们需要直接将系统上传SpringMVC通过MultipartFile类型接收的文件,此时就可使用下面方式解决。

public String uploadFileWithInputStream(MultipartFile file) throws IOException {
// 1、封装请求头
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("multipart/form-data");
headers.setContentType(type);
headers.setContentLength(file.getSize());
headers.setContentDispositionFormData("media", file.getOriginalFilename());
// 2、封装请求体
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
// 将multipartFile转换成byte资源进行传输
ByteArrayResource resource = new ByteArrayResource(file.getBytes()) {
@Override
public String getFilename() {
return file.getOriginalFilename();
}
};
param.add("file", resource);
// 3、封装整个请求报文
HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<>(param, headers);
// 4、发送请求
ResponseEntity<String> data = restTemplate.postForEntity(tempMaterialUploadUrl, formEntity, String.class);
// 5、请求结果处理
JSONObject weChatResult = JSONObject.parseObject(data.getBody());
// 6、返回结果
return weChatResult;
}

注意点:使用ByteArrayResource构建资源时,应重写ByteArrayResourcegetFilename()方法,不然不成功。


以上就是常用的RestTemplate上传不同形式文件的方式。有用点赞~感谢~

RestTemplate上传文件的更多相关文章

  1. Spring Boot 上传文件 获取项目根路径 物理地址 resttemplate上传文件

    springboot部署之后无法获取项目目录的问题: 之前看到网上有提问在开发一个springboot的项目时,在项目部署的时候遇到一个问题:就是我将项目导出为jar包,然后用java -jar 运行 ...

  2. 通过`RestTemplate`上传文件(InputStreamResource详解)

    通过RestTemplate上传文件 1.上传文件File 碰到一个需求,在代码中通过HTTP方式做一个验证的请求,请求的参数包含了文件类型.想想其实很简单,直接使用定义好的MultiValueMap ...

  3. 使用RestTemplate上传文件给远程接口

    MultiValueMap request = new LinkedMultiValueMap(1); ByteArrayResource is = new ByteArrayResource(mul ...

  4. Java模拟http上传文件请求(HttpURLConnection,HttpClient4.4,RestTemplate)

    先上代码: public void uploadToUrl(String fileId, String fileSetId, String formUrl) throws Throwable { St ...

  5. restTemplate.postForObject上传文件中文乱码(???.xls)

    一.问题描述 项目中, 使用restTemplate上传文件时, 文件名中文乱码, 一串问号, 源文件名为: 测试中文乱码哦哦哦.zip, 通过restTemplate.postForObject调用 ...

  6. resttemplate 文件上传 上传文件

    springmvc RestTemplate文件上传 RestTemplate上传文件总结

  7. RestTemplate通过InputStreamResource上传文件

    需求:从ftp取文件并http调用某接口上传此文件 偷懒的话可以从ftp上取文件存到本地,再调用接口上传文件,如下 String ftpPath = "/ftp/path/file.bin& ...

  8. 使用RestTemplate调用接口上传文件

    场景 接口接受一个文件,缓存在本地,验证文件的完整性及内容,然后将文件上传至云服务器: 下面只写利用RestTemplate将文件上传至云服务器,至于文件上传以及缓存在本地可以参考:JAVA文件上传: ...

  9. RestTemplate OR Spring Cloud Feign 上传文件

    SpringBoot,通过RestTemplate 或者 Spring Cloud Feign,上传文件(支持多文件上传),服务端接口是MultipartFile接收. 将文件的字节流,放入ByteA ...

随机推荐

  1. unity---光照基础

    发射光源类型 光照参数介绍 让摄像头看到Flare 耀斑 改变影子

  2. unity---脚本创建文本

    脚本创建文本 新建文件夹 Resources 方便引用字体 在文件Resources中新建Fonts,并且下载一个ttf字体 没有字体,文本内容无法显示 脚本如下 public GameObject ...

  3. 干掉Switch-Case、If-Else----订阅发布模式+事件驱动模式

    在上位机和下位机或者服务端和客户端通信的时候,很多时候可能为了赶项目进度或者写代码方便直接使用Socket通信,传输string类型的关键字驱动对应的事件,这就有可能导致程序中存在大量的Switch- ...

  4. JetBrains IDE全新UI预览版来了,要做简洁与强大兼顾的IDE

    5月23日,JetBrains发布了一篇博文,透露他们正在实现一套全新的界面界面. 他们认为目前行业中的用户界面趋势已经发生了演变,很多新用户认为JetBrains IDE的界面过于笨重,而且过时.所 ...

  5. Spring Ioc源码分析系列--Bean实例化过程(一)

    Spring Ioc源码分析系列--Bean实例化过程(一) 前言 上一篇文章Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理已经完成了对 ...

  6. 儿童节,和 AI 一起通关 “超级马里奥兄弟”

    摘要:六一儿童节,快来训练一款自己的游戏 AI,用代码让马里奥从大反派酷霸王的魔掌里救回桃花公主. 本文分享自华为云社区<儿童节,和 AI 一起通关 "超级马里奥兄弟"> ...

  7. Node.js连接MySQL数据库报错

    解决Node.js第一次连接MySQL数据库时出现[SELECT ERROR] - ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authen ...

  8. Docker容器编译安装Redis

    Docker容器编译安装Redis 1.创建容器 -i 交互模式 -d 后端运行 -h 容器的hostname --name 容器名 --network 网卡 --ip IP地址 -p 端口映射 -- ...

  9. react的setState到底是同步还是异步

    在介绍这个问题之前,我们先来看一下一个例子: state = {number:1};componentDidMount(){this.setState({number:3})console.log(t ...

  10. 监控pos收银机

    1.打开pos收银机snmp功能 控制面板-->程序和功能-->启用或关闭windows功能→简单网络管理协议(SNMP) 2.配置snmp服务 控制面板-->管理工具-->服 ...