Spring|Spring Cloud Feign实现文件上传下载的示例代码

目录

  • 独立使用Feign
    • 上传文件
    • 下载文件
  • 使用Spring Cloud Feign
    • 上传文件
    • 下载文件
  • 总结
    Feign框架对于文件上传消息体格式并没有做原生支持,需要集成模块feign-form来实现。

    独立使用Feign 添加模块依赖:
    io.github.openfeignfeign-core11.1io.github.openfeign.formfeign-form3.8.0commons-iocommons-io2.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 = https://www.it610.com/article/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.cloudspring-cloud-starter-openfeign3.0.2commons-iocommons-io2.11.0

    上传文件
    定义接口及配置:
    @FeignClient(value = "https://www.it610.com/article/FileAPI", url = "http://localhost:8080", configuration = FileUploadAPI.FileUploadAPIConfiguration.class)public interface FileUploadAPI {/*** 上传单个文件* @param file* @return*/@RequestMapping(value = "https://www.it610.com/test/upload/single", method = RequestMethod.POST, headers = "Content-Type=multipart/form-data")String upload(@RequestPart("file") MultipartFile file); /*** 上传多个文件* @param files* @return*/@RequestMapping(value = "https://www.it610.com/test/upload/batch", method = RequestMethod.POST, headers = "Content-Type=multipart/form-data")String upload(@RequestPart("files") List files); class FileUploadAPIConfiguration {@Autowiredprivate ObjectFactory messageConverters; @Beanpublic Encoder feignEncoder () {return new SpringFormEncoder(new SpringEncoder(messageConverters)); }@Beanpublic Logger feignLogger() {return new Slf4jLogger(); }@Beanpublic 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 = "https://www.it610.com/article/FileDownloadAPI", url = "http://localhost:8080", configuration = FileDownloadAPI.FileDownloadAPIConfiguration.class)public interface FileDownloadAPI {/*** 下载文件* @param fileName 文件名* @return*/@RequestMapping(value = "https://www.it610.com/test/download/file", method = RequestMethod.GET)Response download(@RequestParam("fileName") String fileName); // 下载文件时返回值为Response对象,不需要设置解码器class FileDownloadAPIConfiguration {@Beanpublic Logger feignLogger() {return new Slf4jLogger(); }@Beanpublic 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类型。
    【Spring|Spring Cloud Feign实现文件上传下载的示例代码】到此这篇关于 Spring Cloud Feign实现文件上传下载的示例代码的文章就介绍到这了,更多相关 Spring Cloud Feign文件上传下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

      推荐阅读