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


这篇“怎么用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&gtmons-io</groupId>    <artifactId&gtmons-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, "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, "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&gtmons-io</groupId>    <artifactId&gtmons-io</artifactId>    <version>2.11.0</version></dependency>

    上传文件

    定义接口及配置:

    @FeignClient(value = "FileAPI", url = "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 = "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.apachemons.io.FileUtils工具类将输入流中的内容转存到文件FileUtils.copyInputStreamToFile(response.body().asInputStream(), destFile);

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


    上一篇:Laravel请求的生命周期案例分析

    下一篇:Linux常用命令arj怎么用


    Copyright © 2002-2019 测速网 www.inhv.cn 皖ICP备2023010105号
    测速城市 测速地区 测速街道 网速测试城市 网速测试地区 网速测试街道
    温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!

    热门搜索 城市网站建设 地区网站制作 街道网页设计 大写数字 热点城市 热点地区 热点街道 热点时间 房贷计算器