本篇文章給大家分享的是有關(guān)怎么在spring cloud feign中實現(xiàn)遠程調(diào)用服務(wù)傳輸文件,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
蒙陰網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)自2013年創(chuàng)立以來到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
依賴:
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
創(chuàng)建FeignClient接口(用于指定遠程調(diào)用的服務(wù))
// 申明這是一個Feign客戶端,并且指明服務(wù)id @FeignClient(value = "com-spring-caclulate") public interface CacluFeignClient { // 這里定義了類似于SpringMVC用法的方法,就可以進行RESTful的調(diào)用了 @RequestMapping(value = "/caclu/{num}", method = RequestMethod.GET) public Item caclulate(@PathVariable("num") Integer num); }
一.文件上傳服務(wù)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 FtpApiResponseuploadFileFTP(@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("文件上傳結(jié)束 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.業(yè)務(wù)層
@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服務(wù)目錄 FtpFileRecordDO ftpFileRecordDO = ftpFileManager.fileUploadToFtp(file); if (null == ftpFileRecordDO) { log.info("文件上傳至ftp服務(wù)目錄異常"); throw new ServiceException(ErrorMsgEnum.FILE_UPLOAD_TO_FTP_EXCEPTION); } return ftpFileManager.addFileRecord(ftpFileRecordDO); } catch (Exception e) { log.error("業(yè)務(wù)異常,case", e); throw new ServiceException(ErrorMsgEnum.SYSTEM_ERROR); } } }
3.服務(wù)寫好后,需要把遠程接口暴露出去
@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) FtpApiResponseuploadFileFTP(@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; /** * 調(diào)用遠程上傳文件接口 * * @param file 待上傳的文件 * @return 下載路徑 **/ public FtpApiResponserequestFtpFacade(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); } } }
以上就是怎么在spring cloud feign中實現(xiàn)遠程調(diào)用服務(wù)傳輸文件,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。