1. 程式人生 > 其它 >OpenFeign 遠端呼叫下載檔案 以及上傳檔案

OpenFeign 遠端呼叫下載檔案 以及上傳檔案

上傳檔案:

由服務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。將輸入流複製到輸出流即可,就可以返回到前端了
} }