spring cloud feign实现远程调用服务传输文件的方法
作者:蓝之鱼
这篇文章主要介绍了spring cloud feign实现远程调用服务传输文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
实践案例包括两个项目,服务提供者项目名:upload-service,调用服务项目名:upload-client,主要给出两个服务之间的调用过程,文件上传功能不提供
项目框架:spring-boot 2.0.1.RELEASE、spring-cloud Finchley.RELEASE
依赖:
<dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency>
// 申明这是一个Feign客户端,并且指明服务id @FeignClient(value = "com-spring-caclulate") public interface CacluFeignClient { // 这里定义了类似于SpringMVC用法的方法,就可以进行RESTful的调用了 @RequestMapping(value = "/caclu/{num}", method = RequestMethod.GET) public Item caclulate(@PathVariable("num") Integer num); }
一.文件上传服务upload-service
1.控制层
@Slf4j @CrossOrigin @RestController @RequestMapping("/ftp") @Api(description = "文件上传控制") public class FtpFileController { @Autowired private FtpFileService ftpFileService; /** * FTP文件上传 * * @return */ @PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public FtpApiResponse<FtpUploadResDTO> uploadFileFTP(@RequestPart(value = "file") MultipartFile file, @RequestParam("logId") String logId) { FtpApiResponse<FtpUploadResDTO> result = new FtpApiResponse<>(); LogUtil.updateLogId(logId); try { log.info("文件上传开始!}"); Long startTime = System.currentTimeMillis(); FtpUploadResDTO resDTO = ftpFileService.uploadFile(file); result.setData(resDTO); result.setSuccess(true); result.setTimeInMillis(System.currentTimeMillis() - startTime); log.info("文件上传结束 resDTO:{},耗时:{}", resDTO, (System.currentTimeMillis() - startTime)); } catch (ServiceException e){ result.setSuccess(false); result.setErrorCode(ErrorMsgEnum.FILE_UPLOAD_EXCEPTION.getCode()); result.setErrorMsg(ErrorMsgEnum.FILE_UPLOAD_EXCEPTION.getMsg()); } catch (Exception e) { result.setSuccess(false); result.setErrorCode(ErrorMsgEnum.SYSTEM_ERROR.getCode()); result.setErrorMsg(ErrorMsgEnum.SYSTEM_ERROR.getMsg()); log.info("文件上传失败 Exception:{}", Throwables.getStackTraceAsString(e)); } return result; } }
2.业务层
@Service @Slf4j public class FtpFileService { @Autowired private FtpFileManager ftpFileManager; /** * 上传文件 * * @param file * @return */ public FtpUploadResDTO uploadFile(MultipartFile file) { try { //判断上传文件是否为空 if (null == file || file.isEmpty() || file.getSize() == 0) { log.info("传入的文件为空,file:{}", file); throw new ServiceException(ErrorMsgEnum.EMPTY_FILE); } //文件上传至ftp服务目录 FtpFileRecordDO ftpFileRecordDO = ftpFileManager.fileUploadToFtp(file); if (null == ftpFileRecordDO) { log.info("文件上传至ftp服务目录异常"); throw new ServiceException(ErrorMsgEnum.FILE_UPLOAD_TO_FTP_EXCEPTION); } return ftpFileManager.addFileRecord(ftpFileRecordDO); } catch (Exception e) { log.error("业务异常,case", e); throw new ServiceException(ErrorMsgEnum.SYSTEM_ERROR); } } }
3.服务写好后,需要把远程接口暴露出去
@FeignClient(value = "upload-service", configuration = UpDownFtpFacade.MultipartSupportConfig.class) public interface UpDownFtpFacade { /** * FTP上传文件 * * @param file 文件 * @param logId 日志id * @return */ @PostMapping(value = "/ftp/uploadFile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) FtpApiResponse<FtpUploadResDTO> uploadFileFTP(@RequestPart(value = "file") MultipartFile file, @RequestParam("logId") String logId); /** * 引用配置类MultipartSupportConfig.并且实例化 */ @Configuration class MultipartSupportConfig { @Bean public Encoder feignFormEncoder() { return new SpringFormEncoder(); } } }
二.文件上传客户端upload-client
@Slf4j @Component public class FileManager { @Autowired private UpDownFtpFacade upDownFtpFacade; /** * 调用远程上传文件接口 * * @param file 待上传的文件 * @return 下载路径 **/ public FtpApiResponse<FtpUploadResDTO> requestFtpFacade(MultipartFile file) { try { DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("file", MediaType.ALL_VALUE, true, file.getOriginalFilename()); InputStream input = file.getInputStream(); OutputStream os = fileItem.getOutputStream(); IOUtils.copy(input, os); MultipartFile multi = new CommonsMultipartFile(fileItem); FtpApiResponse<FtpUploadResDTO> response = upDownFtpFacade.uploadFileFTP(multi, LogUtil.getLogId()); if (null == response || !response.getSuccess() || null == response.getData()) { throw new ManagerException(ErrorMsgEnum.FIlE_UPLOAD_FAILED); } return response; } catch (Exception e) { throw new ManagerException(ErrorMsgEnum.FIlE_UPLOAD_FAILED); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。