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

网友投稿 218 2022-10-30

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

目录独立使用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("fileshttp://") 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.closehttp://();

fihttp://s2.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类型。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Kubernetes 下零信任安全架构分析
下一篇:常见的USB接口标准都有哪些 速度又有何区别
相关文章

 发表评论

暂时没有评论,来抢沙发吧~