您好,登錄后才能下訂單哦!
這篇“怎么用Spring Cloud Feign實現(xiàn)文件上傳下載”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么用Spring Cloud Feign實現(xiàn)文件上傳下載”文章吧。
Feign框架對于文件上傳消息體格式并沒有做原生支持,需要集成模塊feign-form來實現(xiàn)。
添加模塊依賴:
<!-- 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 { // 上傳文件:參數(shù)為單個文件對象 @RequestLine("POST /test/upload/single") @Headers("Content-Type: multipart/form-data") String upload(@Param("file") File file); // 上傳文件:參數(shù)文多個文件對象 @RequestLine("POST /test/upload/batch") @Headers("Content-Type: multipart/form-data") String upload(@Param("files") File[] files); // 上傳文件:參數(shù)文多個文件對象 @RequestLine("POST /test/upload/batch") @Headers("Content-Type: multipart/form-data") String upload(@Param("files") List<File> files); // 上傳文件:參數(shù)為文件字節(jié)數(shù)組(這種方式在服務(wù)端無法獲取文件名,不要使用) @RequestLine("POST /test/upload/single") @Headers("Content-Type: multipart/form-data") String upload(@Param("file") byte[] bytes); // 上傳文件:參數(shù)為FormData對象 @RequestLine("POST /test/upload/single") @Headers("Content-Type: multipart/form-data") String upload(@Param("file") FormData photo); // 上傳文件:參數(shù)為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; } } }
調(diào)用接口:
FileAPI fileAPI = Feign.builder() .encoder(new FormEncoder()) // 必須明確設(shè)置請求參數(shù)編碼器 .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:參數(shù)為文件對象 fileAPI.upload(file1); // 上傳文件2:參數(shù)為字節(jié)數(shù)組(注意:在服務(wù)端無法獲取到文件名) byte[] bytes = FileUtils.readFileToByteArray(file1); fileAPI.upload(bytes); // 上傳文件3:參數(shù)為FormData對象 byte[] bytes = FileUtils.readFileToByteArray(file1); FormData formData = new FormData("image/jpg", "test1.jpg", bytes); String result = fileAPI.upload(formData); // 上傳文件4:參數(shù)為POJO對象 FileAPI.MyFile myFile = new FileAPI.MyFile(); myFile.setPublic(true); myFile.setFile(file1); fileAPI.upload(myFile); // 上傳文件:參數(shù)為多個文件 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); }
調(diào)用接口:
// 下載文件時返回值為Response對象,不需要設(shè)置解碼器 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框架中使用Feign實現(xiàn)文件上傳時需要依賴feign-form和feign-form-spring,這2個模塊已經(jīng)在“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; } } }
調(diào)用接口:
// 上傳單個文件 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對象,不需要設(shè)置解碼器 class FileDownloadAPIConfiguration { @Bean public Logger feignLogger() { return new Slf4jLogger(); } @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } } }
調(diào)用接口:
String fileName = "test.jpg"; Response response = this.fileDownloadAPI.download(fileName); File destFile = new File("D:\\Downloads\\", fileName); // 使用org.apache.commons.io.FileUtils工具類將輸入流中的內(nèi)容轉(zhuǎn)存到文件 FileUtils.copyInputStreamToFile(response.body().asInputStream(), destFile);
以上就是關(guān)于“怎么用Spring Cloud Feign實現(xiàn)文件上傳下載”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。