多平台统一管理软件接口,如何实现多平台统一管理软件接口
525
2023-01-22
spring cloud feign实现远程调用服务传输文件的方法
实践案例包括两个项目,服务提供者项目名:upload-service,调用服务项目名:upload-client,主要给出两个服务之间的调用过程,文件上传功能不提供
项目框架:spring-boot 2.0.1.RELEASE、spring-cloud Finchley.RELEASE
依赖:
创建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
@RequestParam("logId") String logId) {
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
@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
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
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~