RestTemplate上传文件
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()方法,否则不成功。至于参数中的fileName和contentLength要提前通过文件的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构建资源时,应重写ByteArrayResource的getFilename()方法,不然不成功。
以上就是常用的RestTemplate上传不同形式文件的方式。有用点赞~感谢~
RestTemplate上传文件的更多相关文章
- Spring Boot 上传文件 获取项目根路径 物理地址 resttemplate上传文件
springboot部署之后无法获取项目目录的问题: 之前看到网上有提问在开发一个springboot的项目时,在项目部署的时候遇到一个问题:就是我将项目导出为jar包,然后用java -jar 运行 ...
- 通过`RestTemplate`上传文件(InputStreamResource详解)
通过RestTemplate上传文件 1.上传文件File 碰到一个需求,在代码中通过HTTP方式做一个验证的请求,请求的参数包含了文件类型.想想其实很简单,直接使用定义好的MultiValueMap ...
- 使用RestTemplate上传文件给远程接口
MultiValueMap request = new LinkedMultiValueMap(1); ByteArrayResource is = new ByteArrayResource(mul ...
- Java模拟http上传文件请求(HttpURLConnection,HttpClient4.4,RestTemplate)
先上代码: public void uploadToUrl(String fileId, String fileSetId, String formUrl) throws Throwable { St ...
- restTemplate.postForObject上传文件中文乱码(???.xls)
一.问题描述 项目中, 使用restTemplate上传文件时, 文件名中文乱码, 一串问号, 源文件名为: 测试中文乱码哦哦哦.zip, 通过restTemplate.postForObject调用 ...
- resttemplate 文件上传 上传文件
springmvc RestTemplate文件上传 RestTemplate上传文件总结
- RestTemplate通过InputStreamResource上传文件
需求:从ftp取文件并http调用某接口上传此文件 偷懒的话可以从ftp上取文件存到本地,再调用接口上传文件,如下 String ftpPath = "/ftp/path/file.bin& ...
- 使用RestTemplate调用接口上传文件
场景 接口接受一个文件,缓存在本地,验证文件的完整性及内容,然后将文件上传至云服务器: 下面只写利用RestTemplate将文件上传至云服务器,至于文件上传以及缓存在本地可以参考:JAVA文件上传: ...
- RestTemplate OR Spring Cloud Feign 上传文件
SpringBoot,通过RestTemplate 或者 Spring Cloud Feign,上传文件(支持多文件上传),服务端接口是MultipartFile接收. 将文件的字节流,放入ByteA ...
随机推荐
- Linux常用命令(超详细)
一.基本命令 1.1 关机和重启 关机 shutdown -h now 立刻关机 shutdown -h 5 5分钟后关机 poweroff 立刻关机 重启 shutdown -r now 立刻重启 ...
- Jackson多态序列化
场景 做一个消息中心,专门负责发送消息.消息分为几种渠道,包括手机通知(Push).短信(SMS).邮件(Email),Websocket等渠道. 我定义了一个基类MessageRequest用来接收 ...
- Spring cloud gateway 如何在路由时进行负载均衡
本文为博主原创,转载请注明出处: 1.spring cloud gateway 配置路由 在网关模块的配置文件中配置路由: spring: cloud: gateway: routes: - id: ...
- python爬虫之JS逆向某易云音乐
Python爬虫之JS逆向采集某易云音乐网站 在获取音乐的详情信息时,遇到请求参数全为加密的情况,现解解决方案整理如下: JS逆向有两种思路: 一种是整理出js文件在Python中直接使用execjs ...
- 打字练习-编程语言关键字系列-java
小编整理的java关键字,内容如下:abstract, assert, boolean, break, byte, case, catch, char, class, const, continue, ...
- idea中一些常用的快捷键
ctrl+shift+alt:多行操作psvm:生成main()方法:fori:生成for循环:Ctrl+Alt+v:自动补齐返回值类型ctrl+o:覆写方法ctrl+i:实现接口中的方法ctrl+s ...
- React.js中JSX的原理与关键实现
在开始开发之前,我们需要创建一个空项目文件夹.安装 初始化 npm init -y 2.安装webpack相关依赖 npm install webpack webpack-cli -D 安装babel ...
- CentOS 7 快速安装docker-compose
安装docker-composegithub的地址下载太慢了,国内可以使用http://get.daocloud.io/#install-compose网站上面的地址. 首先下载docker-comp ...
- Day01 对前端的初步了解
了解了工作性质以及流程 产品经理+UI+前端程序员+后端程序员+测试人员 了解了工作会做到的项目 pc端项目,后台管理系统,APP,小程序,移动端网页 了解了后续需要学到的课程 HTML+CSS Ja ...
- runc hang 导致 Kubernetes 节点 NotReady
Kubernetes 1.19.3 OS: CentOS 7.9.2009 Kernel: 5.4.94-1.el7.elrepo.x86_64 Docker: 20.10.6 先说结论,runc v ...