Spring Cloud Feign文件傳輸?shù)氖纠a
一、配置文件解析器
服務提供者和消費者都需要配置文件解析器,這里使用 commons-fileupload 替換原有的解析器:
依賴:
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
注入 bean :
@Bean(name = "multipartResolver")
public MultipartResolver mutipartResolver(){
CommonsMultipartResolver com = new CommonsMultipartResolver();
com.setDefaultEncoding("utf-8");
return com;
}
程序入口中剔除原有的解析器:
@SpringBootApplication(exclude = {MultipartAutoConfiguration.class})
二、服務提供者,即接收文件一方的配置
Controller 的寫法:
@ResponseBody
@RequestMapping(value = "/upload", method = {RequestMethod.POST},
produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public Result<String> uploadFile(@RequestPart("file")MultipartFile file,
@RequestParam("id")Long id){
String fileName = file.getOriginalFilename();
String extend = FileOperateUtil.suffix(fileName);
FileOperateUtil.copy("E:\\" + fileName, file);
return ResultBuilder.success("ok");
}
@RequestPart 指定文件,后面的 @RequestParam 是額外參數(shù),注意額外參數(shù)不能超過url長度限制。
三、服務消費者配置
依賴:
<dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.2.2</version> </dependency>
文件編碼配置:
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.cloud.netflix.feign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MultipartSupportConfig{
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignFormEncoder(){
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
}
Feign 接口定義:
@FeignClient(name = "test-upload")
public interface UploadService{
@ResponseBody
@RequestMapping(value = "/upload", method = {RequestMethod.POST},
produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result<String>uploadFile(@RequestPart("file")MultipartFile file,
@RequestParam("id")Long id);
}
與普通 Feign 接口寫法差不多,注意方法注解和參數(shù)與服務提供者的 controller 一樣。
Controller 的寫法, Controller 中接收前端傳過來的文件信息和額外參數(shù),然后通過 Feign 接口傳輸?shù)竭h端:
// 注入 feign 接口
@Autowired
private UploadService uploadService;
@RequestMapping(value = "/upload", method = RequestMethod.POST, produces = "application/json; charset=utf-8")
@ResponseBody
public Result<String> testUpload(HttpServletRequest request, Long id){
Result<String> result = null;
MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = mRequest.getFileMap();
for (MultipartFile mFile : fileMap.values()) {
String fileName = mFile.getOriginalFilename();
result = uploadService.uploadFile(mFile, id);
}
return result;
}
四、總結(jié)
最后梳理一下流程,服務消費者接收前端(如瀏覽器)傳過來的文件,但是并不進行業(yè)務處理,然后通過 Feign 調(diào)用接口,把文件傳給服務提供者,服務提供者拿到文件后,進行相應的業(yè)務處理。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- 解決Spring Cloud Feign 請求時附帶請求頭的問題
- SpringCloud 服務負載均衡和調(diào)用 Ribbon、OpenFeign的方法
- Spring Cloud Feign 自定義配置(重試、攔截與錯誤碼處理) 代碼實踐
- SpringCloud Feign參數(shù)問題及解決方法
- 詳解springcloud 基于feign的服務接口的統(tǒng)一hystrix降級處理
- 詳解spring cloud feign踩坑記錄
- 詳解Spring Cloud Feign 熔斷配置的一些小坑
- Spring Cloud如何使用Feign構(gòu)造多參數(shù)的請求
- Spring Cloud Feign內(nèi)部實現(xiàn)代碼細節(jié)
相關(guān)文章
.properties文件讀取及占位符${...}替換源碼解析
本篇文章主要介紹了.properties文件讀取及占位符${...}替換源碼解析的相關(guān)知識,具有很好的參考價值。下面跟著小編一起來看下吧2017-05-05
MAC 系統(tǒng)如何使用 Sublime Text 2 直接編譯運行 java 代碼
這篇文章主要介紹了MAC 系統(tǒng)如何使用 Sublime Text 2 直接編譯運行 java 代碼,需要的朋友可以參考下2014-10-10
springmvc+shiro自定義過濾器的實現(xiàn)代碼
這篇文章主要介紹了springmvc+shiro自定義過濾器的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-10-10
Mybatis-plus通過添加攔截器實現(xiàn)簡單數(shù)據(jù)權(quán)限
系統(tǒng)需要根據(jù)用戶所屬的公司,來做一下數(shù)據(jù)權(quán)限控制,具體一點,就是通過表中的company_id進行權(quán)限控制,項目使用的是mybatis-plus,所以通過添加攔截器的方式,修改查詢sql,實現(xiàn)數(shù)據(jù)權(quán)限,本文就通過代碼給大家詳細的講解一下,需要的朋友可以參考下2023-08-08
Spring中的singleton和prototype的實現(xiàn)
這篇文章主要介紹了Spring中的singleton和prototype的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07

