工作上,遇到一个问题。我需要用@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下载和上传文件相关推荐

  1. 以命令方式从ftp服务器上下载和上传文件

    ** 以命令方式从ftp服务器上下载和上传文件 wang ** 1."开始"→"运行",输入"cmd",打开命令提示符: 2.在命令提示符内 ...

  2. 通过CMD命令连接ftp下载和上传文件

    通过CMD命令连接ftp下载文件 win+r输入cmd打开DOS命令 2.连接ftp 格式:ftp ip然后回车根据提示输入用户名和密码 3.登陆成功后.输入"cd"命令.会显示& ...

  3. javaWeb Response下载和上传文件

    下载文件 public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest ...

  4. 图解使用CURL下载和上传文件

    参阅 http://blog.csdn.net/wulong710/article/details/53127606 下面图解操作过程: 下载单个文件,默认将输出打印到标准输出中(STDOUT)中 通 ...

  5. MobaXterm下载上传文件和上传文件夹

    MobaXterm 怎么样上传和下载文件? 左侧栏:下载和上传文件 MobaXterm 怎么样上传文件夹? 选中文件夹拖拽即可

  6. java http 下载网页代码_Java下http下载文件客户端和上传文件客户端实例代码

    Java下http下载文件客户端和上传文件客户端实例代码 发布于 2021-1-14| 复制链接 摘记: 一.下载客户端代码 ```java package javadownload; import ...

  7. 【TFTP客户端--实现下载文件和上传文件】

    TFTP客户端--实现下载文件和上传文件 TFTP协议 文件下载 文件上传 main TFTP协议 TFTP是一个传输文件的简单协议,它其于UDP协议而实现,但是我们也不能确定有些TFTP协议是基于其 ...

  8. linux怎样自动检查link文件_自动共享和上传文件到兼容的托管站点 | Linux 中国

    Anypaste 将会根据你想上传的文件的类型来自动挑选合适的托管站点.简单地说,照片将被上传到图像托管站点,视频被传到视频站点,代码被传到 pastebin. -- Sk(作者) 前阵子我们写了一个 ...

  9. RHEL6.3配置FTP服务器(2) 本地用户下载和上传

    在上篇博文中我们实现了匿名用户的下载和上传,但在更多情况下我们需要对访问FTP的用户进行身份验证,这就需要设置FTP用户. vsftpd可以直接使用Linux系统的本地用户作为FTP用户,提供基于用户 ...

最新文章

  1. 持续集成 - Hudson
  2. thinkphp概述
  3. boost::local_time模块custom_time_zone 和 posix_time_zone 的简单示例
  4. Pycharm SSH 容器中的python环境
  5. linux重定向输出时加时间变量,shell 重定向错误输出到文件 加上时间(标明错误抛出的时间)...
  6. C++中public/private/protected三种继承方式下基类成员对派生类的可见性探讨
  7. redis数据库无法写入导致的bug
  8. java访问网络接口_Java网络访问 java调用http java调用其他接口
  9. Qt报错:C:\Program Files (x86)\SogouInput\Components\
  10. linux kettle命令,Linux下用命令来执行kettle文件资源库的文件ktr与kjb的方法
  11. 你TM管这着玩意儿叫H5编辑器?????
  12. JavaScript 实现 标签页 切换效果
  13. 微信小程序 js创建Object对象
  14. java灌水bfs二叉树,二叉树的BFS搜索
  15. 尚硅谷-SpringCloud
  16. springboot中整合mybatis及简单使用
  17. LVTTL与LVCMOS区别
  18. 软件开发中的需求分析
  19. 【测绘程序设计】——地形图图幅号计算
  20. 腾讯30亿入股盛大游戏;财付通支付宝被罚60万;特斯拉亏损7亿美金丨价值早报

热门文章

  1. Excel单选按钮+滚动条制作动态图表
  2. 决胜移动互联网 网址导航迎来新曙光
  3. php eol 没有换行,php_eol没有换行怎么办
  4. php表单输入内容换行,php中表单输入框中换行回车替换
  5. 社会名流问题的解答----算法引论学习
  6. 往page中的records添加记录,遇到UnsupportedOperationException
  7. Oracle abs函数
  8. 企业用网络推广工具好不好?
  9. Perceptron, BP network
  10. 1292 - Truncated incorrect DOUBLE value: ‘NIL‘