千家信息网

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

发表于:2025-02-10 作者:千家信息网编辑
千家信息网最后更新 2025年02月10日,这篇"怎么用Spring Cloud Feign实现文件上传下载"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获
千家信息网最后更新 2025年02月10日怎么用Spring Cloud Feign实现文件上传下载

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

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

    独立使用Feign

    添加模块依赖:

        io.github.openfeign    feign-core    11.1    io.github.openfeign.form    feign-form    3.8.0    commons-io    commons-io    2.11.0

    上传文件

    定义接口:

    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 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 queryMap);}

    调用接口:

    // 下载文件时返回值为Response对象,不需要设置解码器FileAPI fileAPI = Feign.builder()                .logger(new Slf4jLogger())                .logLevel(Logger.Level.FULL)                .target(FileAPI.class, "http://localhost:8080");String fileName = "test.jpg";Map 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依赖即可。

        org.springframework.cloud    spring-cloud-starter-openfeign    3.0.2    commons-io    commons-io    2.11.0

    上传文件

    定义接口及配置:

    @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 files);    class FileUploadAPIConfiguration {        @Autowired        private ObjectFactory 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实现文件上传下载"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

    0