文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么用Spring Cloud Feign实现文件上传下载

2023-06-29 04:50

关注

这篇“怎么用Spring Cloud Feign实现文件上传下载”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用Spring Cloud Feign实现文件上传下载”文章吧。

 Feign框架对于文件上传消息体格式并没有做原生支持,需要集成模块feign-form来实现。

独立使用Feign

添加模块依赖:

<!-- Feign框架核心 --><dependency>    <groupId>io.github.openfeign</groupId>    <artifactId>feign-core</artifactId>    <version>11.1</version></dependency><!-- 支持表单格式,文件上传格式 --><dependency>    <groupId>io.github.openfeign.form</groupId>    <artifactId>feign-form</artifactId>    <version>3.8.0</version></dependency><!-- 文件操作工具类 --><dependency>    <groupId>commons-io</groupId>    <artifactId>commons-io</artifactId>    <version>2.11.0</version></dependency>

上传文件

定义接口:

public interface FileUploadAPI {    // 上传文件:参数为单个文件对象    @RequestLine("POST /test/upload/single")    @Headers("Content-Type: multipart/form-data")    String upload(@Param("file") File file);    // 上传文件:参数文多个文件对象    @RequestLine("POST /test/upload/batch")    @Headers("Content-Type: multipart/form-data")    String upload(@Param("files") File[] files);    // 上传文件:参数文多个文件对象    @RequestLine("POST /test/upload/batch")    @Headers("Content-Type: multipart/form-data")    String upload(@Param("files") List<File> files);    // 上传文件:参数为文件字节数组(这种方式在服务端无法获取文件名,不要使用)    @RequestLine("POST /test/upload/single")    @Headers("Content-Type: multipart/form-data")    String upload(@Param("file") byte[] bytes);    // 上传文件:参数为FormData对象    @RequestLine("POST /test/upload/single")    @Headers("Content-Type: multipart/form-data")    String upload(@Param("file") FormData photo);    // 上传文件:参数为POJO对象    @RequestLine("POST /test/upload/single")    @Headers("Content-Type: multipart/form-data")    String upload(@Param("file") MyFile myFile);    class MyFile {        @FormProperty("is_public")        Boolean isPublic;        File file;        public Boolean getPublic() {            return isPublic;        }        public void setPublic(Boolean aPublic) {            isPublic = aPublic;        }        public File getFile() {            return file;        }        public void setFile(File file) {            this.file = file;        }    }}

调用接口:

FileAPI fileAPI = Feign.builder()        .encoder(new FormEncoder()) // 必须明确设置请求参数编码器        .logger(new Slf4jLogger())        .logLevel(Logger.Level.FULL)        .target(FileAPI.class, "http://localhost:8080");File file1 = new File("C:\\Users\\xxx\\Downloads\\test1.jpg");File file2 = new File("C:\\Users\\xxx\\Downloads\\test2.jpg");// 上传文件1:参数为文件对象fileAPI.upload(file1);// 上传文件2:参数为字节数组(注意:在服务端无法获取到文件名)byte[] bytes = FileUtils.readFileToByteArray(file1);fileAPI.upload(bytes);// 上传文件3:参数为FormData对象byte[] bytes = FileUtils.readFileToByteArray(file1);FormData formData = new FormData("image/jpg", "test1.jpg", bytes);String result = fileAPI.upload(formData);// 上传文件4:参数为POJO对象FileAPI.MyFile myFile = new FileAPI.MyFile();myFile.setPublic(true);myFile.setFile(file1);fileAPI.upload(myFile);// 上传文件:参数为多个文件fileAPI.upload(new File[]{file1, file2});fileAPI.upload(Arrays.asList(new File[]{file1, file2}));

下载文件

定义接口:

public interface FileDownloadAPI {    // 下载文件    @RequestLine("GET /test/download/file")    Response download(@QueryMap Map<String, Object> queryMap);}

调用接口:

// 下载文件时返回值为Response对象,不需要设置解码器FileAPI fileAPI = Feign.builder()                .logger(new Slf4jLogger())                .logLevel(Logger.Level.FULL)                .target(FileAPI.class, "http://localhost:8080");String fileName = "test.jpg";Map<String, Object> queryMap = new HashMap<>();queryMap.put("fileName", fileName);Response response = fileAPI.download(queryMap);if (response.status() == 200) {    File downloadFile = new File("D:\\Downloads\\", fileName);    FileUtils.copyInputStreamToFile(response.body().asInputStream(), downloadFile);}

使用Spring Cloud Feign

在Spring框架中使用Feign实现文件上传时需要依赖feign-form和feign-form-spring,这2个模块已经在“Spring Cloud Feign”中自带了,只需要添加spring-cloud-starter-openfeign依赖即可。

<!-- 集成Spring和Feign,包含了模块feign-form和feign-form-spring --><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-openfeign</artifactId>    <version>3.0.2</version></dependency><!-- 文件操作工具类 --><dependency>    <groupId>commons-io</groupId>    <artifactId>commons-io</artifactId>    <version>2.11.0</version></dependency>

上传文件

定义接口及配置:

@FeignClient(value = "FileAPI", url = "http://localhost:8080", configuration = FileUploadAPI.FileUploadAPIConfiguration.class)public interface FileUploadAPI {        @RequestMapping(value = "/test/upload/single", method = RequestMethod.POST, headers = "Content-Type=multipart/form-data")    String upload(@RequestPart("file") MultipartFile file);        @RequestMapping(value = "/test/upload/batch", method = RequestMethod.POST, headers = "Content-Type=multipart/form-data")    String upload(@RequestPart("files") List<MultipartFile> files);    class FileUploadAPIConfiguration {        @Autowired        private ObjectFactory<HttpMessageConverters> messageConverters;        @Bean        public Encoder feignEncoder () {            return new SpringFormEncoder(new SpringEncoder(messageConverters));        }        @Bean        public Logger feignLogger() {            return new Slf4jLogger();        }        @Bean        public Logger.Level feignLoggerLevel() {            return Logger.Level.FULL;        }    }}

调用接口:

// 上传单个文件File file = new File("C:\\Users\\xxx\\Downloads\\test1.jpg");FileInputStream fis = new FileInputStream(file);MockMultipartFile mockMultipartFile = new MockMultipartFile("file", file.getName(), "image/jpg", fis);this.fileUploadAPI.upload(mockMultipartFile);fis.close();// 上传多个文件File file1 = new File("C:\\Users\\xxx\\Downloads\\test1.jpg");File file2 = new File("C:\\Users\\xxx\\Downloads\\test2.jpg");FileInputStream fis1 = new FileInputStream(file1);FileInputStream fis2 = new FileInputStream(file2);MockMultipartFile f1 = new MockMultipartFile("files", file1.getName(), "image/jpg", fis1);MockMultipartFile f2 = new MockMultipartFile("files", file2.getName(), "image/jpg", fis2);this.fileUploadAPI.upload(Arrays.asList(new MockMultipartFile[]{f1, f2}));fis1.close();fis2.close();

下载文件

定义接口:

@FeignClient(value = "FileDownloadAPI", url = "http://localhost:8080", configuration = FileDownloadAPI.FileDownloadAPIConfiguration.class)public interface FileDownloadAPI {        @RequestMapping(value = "/test/download/file", method = RequestMethod.GET)    Response download(@RequestParam("fileName") String fileName);    // 下载文件时返回值为Response对象,不需要设置解码器    class FileDownloadAPIConfiguration {        @Bean        public Logger feignLogger() {            return new Slf4jLogger();        }        @Bean        public Logger.Level feignLoggerLevel() {            return Logger.Level.FULL;        }    }}

调用接口:

String fileName = "test.jpg";Response response = this.fileDownloadAPI.download(fileName);File destFile = new File("D:\\Downloads\\", fileName);// 使用org.apache.commons.io.FileUtils工具类将输入流中的内容转存到文件FileUtils.copyInputStreamToFile(response.body().asInputStream(), destFile);

以上就是关于“怎么用Spring Cloud Feign实现文件上传下载”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯