OpenFeign 远程调用下载文件 以及上传文件
Posted 幻樱落日剑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。将输入流复制到输出流即可,就可以返回到前端了
} }
以上是关于OpenFeign 远程调用下载文件 以及上传文件的主要内容,如果未能解决你的问题,请参考以下文章