使用spring-cloud-FeignClient下载和上传文件
工作上,遇到一个问题。我需要用@FeignClient远程调用文件服务,下载一个doc文件,把它转换成ceb或pdf文件,在上传到文件系统。其实我就是在开发文件转换服务。那么,我们该怎么用FeignClient来下载文件?
Spring将响应转换为字节数组ByteArrayHttpMessageConverter,但它支持application / octet-stream和/ media类型。我们可以用byte[]来接收文件。例如下面这样写:
@FeignClient(value = "epolicy", path = "/epolicy/download", url = "http://10.1.118.45:8001") public interface EPolicyApi {@RequestMapping(method = RequestMethod.POST)
byte[] download(@RequestParam("policyNo") String policyNo, @RequestParam("idNo") String idNo);}
但是我们可以学习老外这么写:https://github.com/spring-cloud/spring-cloud-netflix/issues/2246
用feign-form上传文件
<dependency><groupId>io.github.openfeign.form</groupId><artifactId>feign-form</artifactId><version>2.2.1</version>
</dependency><dependency><groupId>io.github.openfeign.form</groupId><artifactId>feign-form-spring</artifactId><version>2.2.1</version>
</dependency
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.*;public class InMemoryMultipartFile implements MultipartFile {private final String name;private final String originalFileName;private final String contentType;private final byte[] payload;public InMemoryMultipartFile(File file) throws IOException {this.originalFileName = file.getName();this.payload = FileCopyUtils.copyToByteArray(file);this.name = "file";this.contentType = "application/octet-stream";}public InMemoryMultipartFile(String originalFileName, byte[] payload) {this.originalFileName = originalFileName;this.payload = payload;this.name = "file";this.contentType = "application/octet-stream";}public InMemoryMultipartFile(String name, String originalFileName, String contentType, byte[] payload) {if (payload == null) {throw new IllegalArgumentException("Payload cannot be null.");}this.name = name;this.originalFileName = originalFileName;this.contentType = contentType;this.payload = payload;}@Overridepublic String getName() {return name;}@Overridepublic String getOriginalFilename() {return originalFileName;}@Overridepublic String getContentType() {return contentType;}@Overridepublic boolean isEmpty() {return payload.length == 0;}@Overridepublic long getSize() {return payload.length;}@Overridepublic byte[] getBytes() throws IOException {return payload;}@Overridepublic InputStream getInputStream() throws IOException {return new ByteArrayInputStream(payload);}@Overridepublic void transferTo(File dest) throws IOException, IllegalStateException {new FileOutputStream(dest).write(payload);}
}
@FeignClient(value = "material", configuration = MaterialClient.MultipartSupportConfig.class)
public interface MaterialClient {@PostMapping("/uploadFile")@Headers("Content-Type: multipart/form-data")ResponseMO uploadFile(@RequestPart("file") MultipartFile file);@GetMapping("/oss/downFile")MultipartFile downFile(@RequestParam("key") String key);class MultipartSupportConfig {@AutowiredObjectFactory<HttpMessageConverters> messageConverters;@Bean@Primary@Scope("prototype")public Encoder multipartFormEncoder() {return new SpringFormEncoder(new SpringEncoder(messageConverters));}@Bean@Primary@Scope("prototype")public Decoder decoder() {Decoder decoder = (response, type) -> {if (type instanceof Class && MultipartFile.class.isAssignableFrom((Class) type)) {Collection<String> contentTypes = response.headers().get("content-type");String contentType = "application/octet-stream";if (contentTypes.size() > 0) {String[] temp = new String[contentTypes.size()];contentTypes.toArray(temp);contentType = temp[0];}byte[] bytes = StreamUtils.copyToByteArray(response.body().asInputStream());InMemoryMultipartFile inMemoryMultipartFile = new InMemoryMultipartFile("file","", contentType,bytes);return inMemoryMultipartFile;}return new SpringDecoder(messageConverters).decode(response, type);};return new ResponseEntityDecoder(decoder);}}
}
转载于:https://my.oschina.net/Jevon95/blog/1859688
使用spring-cloud-FeignClient下载和上传文件相关推荐
- 以命令方式从ftp服务器上下载和上传文件
** 以命令方式从ftp服务器上下载和上传文件 wang ** 1."开始"→"运行",输入"cmd",打开命令提示符: 2.在命令提示符内 ...
- 通过CMD命令连接ftp下载和上传文件
通过CMD命令连接ftp下载文件 win+r输入cmd打开DOS命令 2.连接ftp 格式:ftp ip然后回车根据提示输入用户名和密码 3.登陆成功后.输入"cd"命令.会显示& ...
- javaWeb Response下载和上传文件
下载文件 public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest ...
- 图解使用CURL下载和上传文件
参阅 http://blog.csdn.net/wulong710/article/details/53127606 下面图解操作过程: 下载单个文件,默认将输出打印到标准输出中(STDOUT)中 通 ...
- MobaXterm下载上传文件和上传文件夹
MobaXterm 怎么样上传和下载文件? 左侧栏:下载和上传文件 MobaXterm 怎么样上传文件夹? 选中文件夹拖拽即可
- java http 下载网页代码_Java下http下载文件客户端和上传文件客户端实例代码
Java下http下载文件客户端和上传文件客户端实例代码 发布于 2021-1-14| 复制链接 摘记: 一.下载客户端代码 ```java package javadownload; import ...
- 【TFTP客户端--实现下载文件和上传文件】
TFTP客户端--实现下载文件和上传文件 TFTP协议 文件下载 文件上传 main TFTP协议 TFTP是一个传输文件的简单协议,它其于UDP协议而实现,但是我们也不能确定有些TFTP协议是基于其 ...
- linux怎样自动检查link文件_自动共享和上传文件到兼容的托管站点 | Linux 中国
Anypaste 将会根据你想上传的文件的类型来自动挑选合适的托管站点.简单地说,照片将被上传到图像托管站点,视频被传到视频站点,代码被传到 pastebin. -- Sk(作者) 前阵子我们写了一个 ...
- RHEL6.3配置FTP服务器(2) 本地用户下载和上传
在上篇博文中我们实现了匿名用户的下载和上传,但在更多情况下我们需要对访问FTP的用户进行身份验证,这就需要设置FTP用户. vsftpd可以直接使用Linux系统的本地用户作为FTP用户,提供基于用户 ...
最新文章
- 持续集成 - Hudson
- thinkphp概述
- boost::local_time模块custom_time_zone 和 posix_time_zone 的简单示例
- Pycharm SSH 容器中的python环境
- linux重定向输出时加时间变量,shell 重定向错误输出到文件 加上时间(标明错误抛出的时间)...
- C++中public/private/protected三种继承方式下基类成员对派生类的可见性探讨
- redis数据库无法写入导致的bug
- java访问网络接口_Java网络访问 java调用http java调用其他接口
- Qt报错:C:\Program Files (x86)\SogouInput\Components\
- linux kettle命令,Linux下用命令来执行kettle文件资源库的文件ktr与kjb的方法
- 你TM管这着玩意儿叫H5编辑器?????
- JavaScript 实现 标签页 切换效果
- 微信小程序 js创建Object对象
- java灌水bfs二叉树,二叉树的BFS搜索
- 尚硅谷-SpringCloud
- springboot中整合mybatis及简单使用
- LVTTL与LVCMOS区别
- 软件开发中的需求分析
- 【测绘程序设计】——地形图图幅号计算
- 腾讯30亿入股盛大游戏;财付通支付宝被罚60万;特斯拉亏损7亿美金丨价值早报
热门文章
- Excel单选按钮+滚动条制作动态图表
- 决胜移动互联网 网址导航迎来新曙光
- php eol 没有换行,php_eol没有换行怎么办
- php表单输入内容换行,php中表单输入框中换行回车替换
- 社会名流问题的解答----算法引论学习
- 往page中的records添加记录,遇到UnsupportedOperationException
- Oracle abs函数
- 企业用网络推广工具好不好?
- Perceptron, BP network
- 1292 - Truncated incorrect DOUBLE value: ‘NIL‘