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

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>上传文件

定义接口:

publicinterfaceFileUploadAPI{//上传文件:参数为单个文件对象@RequestLine("POST/test/upload/single")@Headers("Content-Type:multipart/form-data")Stringupload(@Param("file")Filefile);//上传文件:参数文多个文件对象@RequestLine("POST/test/upload/batch")@Headers("Content-Type:multipart/form-data")Stringupload(@Param("files")File[]files);//上传文件:参数文多个文件对象@RequestLine("POST/test/upload/batch")@Headers("Content-Type:multipart/form-data")Stringupload(@Param("files")List<File>files);//上传文件:参数为文件字节数组(这种方式在服务端无法获取文件名,不要使用)@RequestLine("POST/test/upload/single")@Headers("Content-Type:multipart/form-data")Stringupload(@Param("file")byte[]bytes);//上传文件:参数为FormData对象@RequestLine("POST/test/upload/single")@Headers("Content-Type:multipart/form-data")Stringupload(@Param("file")FormDataphoto);//上传文件:参数为POJO对象@RequestLine("POST/test/upload/single")@Headers("Content-Type:multipart/form-data")Stringupload(@Param("file")MyFilemyFile);classMyFile{@FormProperty("is_public")BooleanisPublic;Filefile;publicBooleangetPublic(){returnisPublic;}publicvoidsetPublic(BooleanaPublic){isPublic=aPublic;}publicFilegetFile(){returnfile;}publicvoidsetFile(Filefile){this.file=file;}}}

调用接口:

FileAPIfileAPI=Feign.builder().encoder(newFormEncoder())//必须明确设置请求参数编码器.logger(newSlf4jLogger()).logLevel(Logger.Level.FULL).target(FileAPI.class,"http://localhost:8080");Filefile1=newFile("C:\\Users\\xxx\\Downloads\\test1.jpg");Filefile2=newFile("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);FormDataformData=newFormData("image/jpg","test1.jpg",bytes);Stringresult=fileAPI.upload(formData);//上传文件4:参数为POJO对象FileAPI.MyFilemyFile=newFileAPI.MyFile();myFile.setPublic(true);myFile.setFile(file1);fileAPI.upload(myFile);//上传文件:参数为多个文件fileAPI.upload(newFile[]{file1,file2});fileAPI.upload(Arrays.asList(newFile[]{file1,file2}));下载文件

定义接口:

publicinterfaceFileDownloadAPI{//下载文件@RequestLine("GET/test/download/file")Responsedownload(@QueryMapMap<String,Object>queryMap);}

调用接口:

//下载文件时返回值为Response对象,不需要设置解码器FileAPIfileAPI=Feign.builder().logger(newSlf4jLogger()).logLevel(Logger.Level.FULL).target(FileAPI.class,"http://localhost:8080");StringfileName="test.jpg";Map<String,Object>queryMap=newHashMap<>();queryMap.put("fileName",fileName);Responseresponse=fileAPI.download(queryMap);if(response.status()==200){FiledownloadFile=newFile("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)publicinterfaceFileUploadAPI{/***上传单个文件*@paramfile*@return*/@RequestMapping(value="/test/upload/single",method=RequestMethod.POST,headers="Content-Type=multipart/form-data")Stringupload(@RequestPart("file")MultipartFilefile);/***上传多个文件*@paramfiles*@return*/@RequestMapping(value="/test/upload/batch",method=RequestMethod.POST,headers="Content-Type=multipart/form-data")Stringupload(@RequestPart("files")List<MultipartFile>files);classFileUploadAPIConfiguration{@AutowiredprivateObjectFactory<HttpMessageConverters>messageConverters;@BeanpublicEncoderfeignEncoder(){returnnewSpringFormEncoder(newSpringEncoder(messageConverters));}@BeanpublicLoggerfeignLogger(){returnnewSlf4jLogger();}@BeanpublicLogger.LevelfeignLoggerLevel(){returnLogger.Level.FULL;}}}

调用接口:

//上传单个文件Filefile=newFile("C:\\Users\\xxx\\Downloads\\test1.jpg");FileInputStreamfis=newFileInputStream(file);MockMultipartFilemockMultipartFile=newMockMultipartFile("file",file.getName(),"image/jpg",fis);this.fileUploadAPI.upload(mockMultipartFile);fis.close();//上传多个文件Filefile1=newFile("C:\\Users\\xxx\\Downloads\\test1.jpg");Filefile2=newFile("C:\\Users\\xxx\\Downloads\\test2.jpg");FileInputStreamfis1=newFileInputStream(file1);FileInputStreamfis2=newFileInputStream(file2);MockMultipartFilef1=newMockMultipartFile("files",file1.getName(),"image/jpg",fis1);MockMultipartFilef2=newMockMultipartFile("files",file2.getName(),"image/jpg",fis2);this.fileUploadAPI.upload(Arrays.asList(newMockMultipartFile[]{f1,f2}));fis1.close();fis2.close();下载文件

定义接口:

@FeignClient(value="FileDownloadAPI",url="http://localhost:8080",configuration=FileDownloadAPI.FileDownloadAPIConfiguration.class)publicinterfaceFileDownloadAPI{/***下载文件*@paramfileName文件名*@return*/@RequestMapping(value="/test/download/file",method=RequestMethod.GET)Responsedownload(@RequestParam("fileName")StringfileName);//下载文件时返回值为Response对象,不需要设置解码器classFileDownloadAPIConfiguration{@BeanpublicLoggerfeignLogger(){returnnewSlf4jLogger();}@BeanpublicLogger.LevelfeignLoggerLevel(){returnLogger.Level.FULL;}}}

调用接口:

StringfileName="test.jpg";Responseresponse=this.fileDownloadAPI.download(fileName);FiledestFile=newFile("D:\\Downloads\\",fileName);//使用org.apache.commons.io.FileUtils工具类将输入流中的内容转存到文件FileUtils.copyInputStreamToFile(response.body().asInputStream(),destFile);

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