一、配置文件解析器
服務提供者和消費者都需要配置文件解析器,這里使用 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 是額外參數,注意額外參數不能超過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;@Configurationpublic 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 接口寫法差不多,注意方法注解和參數與服務提供者的 controller
一樣。
Controller
的寫法, Controller
中接收前端傳過來的文件信息和額外參數,然后通過 Feign 接口傳輸到遠端:
// 注入 feign 接口@Autowiredprivate UploadService uploadService;@RequestMapping(value = "/upload", method = RequestMethod.POST, produces = "application/json; charset=utf-8")@ResponseBodypublic 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;}
四、總結
最后梳理一下流程,服務消費者接收前端(如瀏覽器)傳過來的文件,但是并不進行業務處理,然后通過 Feign 調用接口,把文件傳給服務提供者,服務提供者拿到文件后,進行相應的業務處理。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。
新聞熱點
疑難解答
圖片精選