温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-02-16 11:39:05 来源:亿速云 阅读:399 作者:iii 栏目:开发技术

这篇“怎么用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 {
    
        /**
         * 上传单个文件
         * @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);

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

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI