在项目中我们通常会将一些基础功能封装在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);
}
}