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。将输入流复制到输出流即可,就可以返回到前端了
} }

 

posted @ 2021-06-21 19:55  幻樱落日剑  阅读(1941)  评论(0编辑  收藏  举报