资讯专栏INFORMATION COLUMN

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

lmxdawn / 2271人阅读

摘要:实践案例包括两个项目,服务提供者项目名,调用服务项目名,主要给出两个服务之间的调用过程,文件上传功能不提供项目框架依赖一文件上传服务控制层文件上传控制文件上传文件上传开始文件上传结束,耗时文件上传失败业务层上传文件判

实践案例包括两个项目,服务提供者项目名:upload-service,调用服务项目名:upload-client,主要给出两个服务之间的调用过程,文件上传功能不提供

项目框架:spring-boot 2.0.1.RELEASE、spring-cloud Finchley.RELEASE

依赖:

        
            io.github.openfeign.form
            feign-form
            3.0.3
        
        
            io.github.openfeign.form
            feign-form-spring
            3.0.3
        
        
            commons-fileupload
            commons-fileupload
            1.3.3
        

一.文件上传服务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 uploadFileFTP(@RequestPart(value = "file") MultipartFile file,
                                                         @RequestParam("logId") String logId) {
        FtpApiResponse 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 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 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 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);
        }
     }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76950.html

相关文章

  • SpringCloud(第 012 篇)微服务接入 Feign 负载均衡通过 FeignClient

    摘要:添加电影微服务启动类电影微服务接入进行客户端负载均衡,通过调用远程微服务。注解表示该电影微服务已经接入模块。 SpringCloud(第 012 篇)电影微服务接入 Feign 进行客户端负载均衡,通过 FeignClient 调用远程 Http 微服务 - 一、大致介绍 1、本章节主要介绍在 SpringCloud 生态圈中,使用一个类似于 Java HTTP 客户端的工具 Feig...

    Cobub 评论0 收藏0
  • 8、服务发现&服务消费者Feign

    摘要:公众号乐园的中提供了两个组件实现软负载均衡调用,分别是和。是基于和的客户端负载工具,它是基于实现的,它可以在客户端配置服务端列表,然后轮询请求以实现均衡负载。 公众号:java乐园 spring cloud的Netflix中提供了两个组件实现软负载均衡调用,分别是Ribbon和Feign。上一篇和大家一起学习了Ribbon。Ribbon :Spring Cloud Ribbon是基于H...

    lpjustdoit 评论0 收藏0
  • Spring Cloud Alibaba到底坑不坑?

    摘要:我没有能力去控制那些自媒体发布这些不实的内容,但是在我了解的范围内,还是尽力输出一些我的理解。 之前我发过一篇《说说我为什么看好Spring Cloud Alibaba》,然后这两天有网友给我转了这篇文章《坑爹项目spring-cloud-alibaba,我们也来一个》,问我的看法是怎么样的,聊天时候简单说了一下。今天在家休息,抽空整理一下内容,逐点说一下我的看法,主要还是觉得这篇文章...

    娣辩孩 评论0 收藏0
  • 解决spring cloud Feign远程调用服务,添加headers解决拦截器拦截问题

    摘要:使用做服务器时,经常会通过调用远程服务。有时候我们的远程服务可能做了某些权限验证。如果某没有,可能会被阻止调用。如果每个方法都手动设置,那未免太麻烦。可以通过一个切面,自动帮我们添加请求。 使用spring cloud 做saas服务器时,经常会通过Feign调用远程服务。有时候我们的远程服务可能做了某些权限验证。需要验证header或者token什么的。如果某没有token,可能会被...

    walterrwu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<