Feign远程调用上传和下载文件

在项目中我们通常会将一些基础功能封装在system服务中,然后其他服务统一调用system服务提供的服务。

例如文件上传和下载接口,为了统一管理文件我们会把文件上传和下载功能统一封装在system服务内,其他服务调用system对外提供的上传下载接口。

调用Feign进行文件上传

调用方:

@Operation(summary = "上传文件")
@PostMapping(value = "/upload", consumes = "multipart/form-data")
public Result<String> upload(@RequestPart("file") MultipartFile media) {
    try {
        //调用feign上传文件
        return feignApi.upload(media, module, filePath, authValue);
    } catch (Exception ex) {
        logger.error(String.format("upload file [%s] error", media.getOriginalFilename()), ex);
        return Result.error("上传文件失败");
    }
}

feign声明的接口

@Operation(summary = "上传文件")
@PostMapping(value = "/upload", consumes = "multipart/form-data")
public Result<String> upload(@RequestPart("file") MultipartFile media);

被调用方(system服务)

@Operation(summary = "上传文件")
@PostMapping(value = "/upload", consumes = "multipart/form-data")
public Result<String> upload(@RequestPart("file") MultipartFile media) {
    try {
        return Result.success(fileService.upload(media, module, filePath, authValue));
    } catch (Exception ex) {
        logger.error(String.format("upload file [%s] error", media.getOriginalFilename()), ex);
        return Result.error("上传文件失败");
    }
}

调用feign进行下载文件

调用方:

@Operation(summary = "下载文件")
@GetMapping(value = "/download")
public Result query(@RequestParam("fileId") String fileId, HttpServletResponse servletResponse) {
    //调用feign获取response,文件就在response内
    Response feignResponse = fileApi.downloadFile(fileId, null);

    if(Objects.isNull(feignResponse) || feignResponse.status()!=200){
        return Result.error("文件下载异常");
    }

    Map<String, Collection<String>> headers = feignResponse.headers();
    Collection<String> contentType = headers.get("content-type");
    Collection<String> contentLength = headers.get("content-length");
    Collection<String> contentDisposition = headers.get("content-disposition");

    if(CollUtil.isNotEmpty(contentType)){
        servletResponse.setContentType(CollUtil.getFirst(contentType));
        servletResponse.setContentLengthLong(Long.parseLong(CollUtil.getFirst(contentLength)));
        servletResponse.setHeader("content-disposition",CollUtil.getFirst(contentDisposition));
    }
    Response.Body body = feignResponse.body();
    try (InputStream is = body.asInputStream(); OutputStream os = servletResponse.getOutputStream()){
        IOUtils.copy(is,os);
        os.flush();
    } catch (IOException e) {
        Log.error("文件下载异常",e);
        return Result.error("文件下载异常");
    }
    return null;
}

feign声明的接口

/**
* 这里使用的是 feign.Response
*/
@GetMapping("/downloadFile")
@Operation(summary = "下载文件")
Response downloadFile(@RequestParam("fileId") String fileId);

被调用方(system服务)

@Override
@GetMapping("/downloadFile")
@Operation(summary = "下载文件")
public Response downloadFile(@RequestParam("fileId") String fileId) {

    File file = new File("/usr/local/test.txt");

    //写入response
    HttpServletResponse responses = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
    try (ServletOutputStream outputStream = responses.getOutputStream()){
        responses.setContentType(fileInfo.getContentType());
        responses.setHeader("Content-Disposition","attachment; filename="+ URLEncoder.encode("test.txt", StandardCharsets.UTF_8));
        FileUtil.writeToStream(file,outputStream);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值