OpenFeign 遠端呼叫下載檔案 以及上傳檔案
阿新 • • 發佈:2021-06-21
上傳檔案:
由服務A 呼叫服務B中的上傳檔案介面
1. 服務B中的介面實現
/** * 上傳檔案 檔名採用uuid,避免原始檔名中帶"-"符號導致下載的時候解析出現異常 * @param file 資源 * @return R(/ admin / bucketName / filename) */ @ApiOperation(value = "",notes = "") @PostMapping("/upload") public R upload(@RequestParam("file") MultipartFile file,@ApiParam("檔案路徑") @RequestParam(required = false)String path) { return sysFileService.uploadFile(file,path); //具體程式碼邏輯 }
上傳檔案使用MultipartFile
2.服務A中openFeign
*/ @FeignClient(value = ServiceNameConstants.UPMS_SERVICE,configuration= FeignConfig.class) public interface SysFileFeignService { @PostMapping(value="sys-file/upload", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE) R upload(@RequestPart("file") MultipartFile file);
因為是MultipartFile 物件,傳遞的時候需要設定引數轉換,所以需要配置檔案
3.配置檔案 ***************重點,不配置將會轉換失敗
@Configuration class MultipartSupportConfig { @Autowired private ObjectFactory<HttpMessageConverters> messageConverters // new一個form編碼器,實現支援form表單提交 @Bean Encoder feignFormEncoder() {return new SpringFormEncoder(new SpringEncoder(messageConverters)) } }
4.服務A中Controller
/** * 上傳檔案 */ @ApiOperation(value = "檔案上傳", notes = "檔案上傳") @PostMapping("upload") public R upload(@RequestParam("file") MultipartFile file){ return R.ok(fileFeignService.upload(file)); }
把file傳遞過去即可
下載檔案:
1.服務B中的controller
/** * 獲取檔案 * @param fileName 檔名 * @param name 路徑 * @param response * @return */ @Inner(false) @GetMapping("/getFile") @ApiOperation(value = "獲取檔案", notes = "獲取檔案") @ApiImplicitParams( {@ApiImplicitParam(paramType = "query", dataType = "String", name = "fileName", value = "檔名稱路徑", required = true), @ApiImplicitParam(paramType = "query", dataType = "String", name = "name", value = "中文名稱"), }) public void file(@RequestParam("fileName") String fileName,@RequestParam("name") String name, HttpServletResponse response) { sysFileService.getFile(fileName,name, response); }
2.遠端呼叫
@FeignClient(value = ServiceNameConstants.UPMS_SERVICE,configuration= FeignConfig.class) //對映路徑,配置檔案沒用 public interface SysFileFeignService { // @PostMapping(value="sys-file/upload", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE) // R upload(@RequestPart("file") MultipartFile file); @GetMapping(value = "sys-file/getFile") Response getFile(@RequestParam("fileName") String fileName, @RequestParam("name") String name); }
3.服務A中Controller 重點******
@SneakyThrows @GetMapping("/getFile") @ApiOperation(value = "獲取檔案", notes = "獲取檔案") public void file(@RequestParam("fileName") String fileName,@RequestParam("name") String name, HttpServletResponse response) { response.setContentType("application/octet-stream; charset=UTF-8"); //設定請求引數 try(OutputStream outputStream = response.getOutputStream(); //因為服務B中沒有返回值的,但是這裡它需要把檔案給保留下來,所以使用Response接收引數 Response r = fileFeignService.getFile(fileName,name); InputStream stream = r.body().asInputStream();) { //獲取請求體的輸入流,返回流 IOUtils.copy(stream,outputStream); //呼叫 IOUtils.copy。將輸入流複製到輸出流即可,就可以返回到前端了
} }