Feign实现文件上传下载

博客 分享
0 286
优雅殿下
优雅殿下 2022-02-15 18:55:22
悬赏:0 积分 收藏

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-formfeign-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 {    /**     * 上传单个文件     * @param file     * @return     */    @RequestMapping(value = "/test/upload/single", method = RequestMethod.POST, headers = "Content-Type=multipart/form-data")    String upload(@RequestPart("file") MultipartFile file);    /**     * 上传多个文件     * @param files     * @return     */    @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 {    /**     * 下载文件     * @param fileName 文件名     * @return     */    @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);

总结

1.Feign框架需要集成模块feign-form才能支持文件上传的消息体格式。
2.不论是独立使用Feign,还是使用Spring Cloud Feign,下载文件时的返回值都必须为feign.Response类型。


作者:编程随笔
出处:http://www.cnblogs.com/nuccch/
声明:本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接。

posted @ 2022-02-15 18:46 nuccch 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员