文件上傳、下載也是實際項目中會遇到的場景,本篇我們介紹下springcloud中如何使用feign進行文件上傳與下載。
創(chuàng)新互聯(lián)公司始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達十載累計超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的營銷推廣解決方案,現(xiàn)已廣泛運用于各行各業(yè)的客戶,其中包括:混凝土攪拌站等企業(yè),備受客戶贊美。
還是使用feign 進行http的調(diào)用。
一、Feign文件上傳
服務(wù)提供方j(luò)ava代碼:
/** * 文件上傳 * @param file 文件 * @param fileType * @return */ @RequestMapping(method = RequestMethod.POST, value = "/uploadFile", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public String uploadFile(@RequestPart(value = "file") MultipartFile file, @RequestParam(value = "fileType") String fileType, HttpServletRequest request,HttpServletResponse response) { System.out.println("fileType:"+fileType); long size= file.getSize(); String contentType= file.getContentType(); String name = file.getName(); String orgFilename= file.getOriginalFilename(); System.out.println("size:"+size); System.out.println("contentType:"+contentType); System.out.println("name:"+name); System.out.println("orgFilename:"+orgFilename); String suffix = orgFilename.substring(orgFilename.lastIndexOf("."));//后綴 String uuid =UUID.randomUUID().toString().replaceAll("-", "").toUpperCase(); File dest = new File("f:/b13/"+uuid+suffix); try { file.transferTo(dest); return dest.getCanonicalPath();//文件的絕對路徑 } catch (IllegalStateException | IOException e) { e.printStackTrace(); } return "failure"; }
服務(wù)提供方Feign api接口:
@RequestMapping(method = RequestMethod.POST, value = "/uploadFile", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public String uploadFile(@RequestPart(value = "file") MultipartFile file, @RequestParam(value = "fileType") String fileType);
服務(wù)消費方:
pom.xml
io.github.openfeign.form feign-form 3.0.3 io.github.openfeign.form feign-form-spring 3.0.3
java代碼:
@Autowired private UserProControllerApi userProControllerApi; @ResponseBody @RequestMapping("/user_uploadFile") public Object user_uploadFile(HttpServletRequest request,HttpServletResponse response, @RequestPart(value = "file") MultipartFile file, String fileType) { System.out.println(fileType); return userProControllerApi.uploadFile(file, fileType); }
MultipartSupportConfig.java
@Configuration public class MultipartSupportConfig { @Autowired private ObjectFactorymessageConverters; @Bean @Primary @Scope("prototype") public Encoder feignEncoder() { return new SpringFormEncoder(new SpringEncoder(messageConverters)); } @Bean public feign.Logger.Level multipartLoggerLevel() { return feign.Logger.Level.FULL; } }
二、Feign文件下載
服務(wù)提供方j(luò)ava代碼:
/** * 文件(二進制數(shù)據(jù))下載 * @param fileType 文件類型 * @return */ @RequestMapping("/downloadFile") public ResponseEntitydownloadFile(String fileType,HttpServletRequest request ){ System.out.println(request.getParameter("fileType")); System.out.println("參數(shù)fileType: "+fileType); HttpHeaders headers = new HttpHeaders(); ResponseEntity entity = null; InputStream in=null; try { in=new FileInputStream(new File("d:/myImg/001.png")); byte[] bytes = new byte[in.available()]; String imageName="001.png"; //處理IE下載文件的中文名稱亂碼的問題 String header = request.getHeader("User-Agent").toUpperCase(); if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) { imageName = URLEncoder.encode(imageName, "utf-8"); imageName = imageName.replace("+", "%20"); //IE下載文件名空格變+號問題 } else { imageName = new String(imageName.getBytes(), "iso-8859-1"); } in.read(bytes); headers.add("Content-Disposition", "attachment;filename="+imageName); entity = new ResponseEntity (bytes, headers, HttpStatus.OK); } catch (Exception e) { e.printStackTrace(); }finally { if(in!=null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } return entity; }
服務(wù)提供方feign api接口
@RequestMapping("/downloadFile") public ResponseEntitydownloadFile(@RequestParam(value = "fileType") String fileType );
服務(wù)消費方
@ResponseBody @RequestMapping("/user_downloadFile") public Object user_downloadFile(HttpServletRequest request,HttpServletResponse response, String fileType) { ResponseEntityentity = userProControllerApi.downloadFile(fileType); System.out.println( entity.getStatusCode()); return entity ; }
注:實際項目中如果上傳的文件太大,可以使用ftp服務(wù)器保存上傳的文件,直接在controller端調(diào)用ftp接口即可。
如果下載的文件太大,則調(diào)用service端接口可返回一個ftp文件資源路徑,然后在controller端調(diào)用ftp下載文件即可。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。