当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    spring cloud feign实现远程调用服务传输文件的方法

    栏目:win服务器问题汇总 时间:2019-10-11 11:17

    实践案例包括两个项目,服务提供者项目名: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>

    创建FeignClient接口(用于指定远程调用的服务)

    // 申明这是一个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);
      }
     }
    }