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

网友投稿 525 2023-01-22


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

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

创建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 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 {

@Beanhttp://

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);

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:api接口文档管理工具(API文档工具)
下一篇:Java位运算知识点详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~