SpringCloud使用Feign文件上传、下载
文件上传、下载也是实际项目中会遇到的场景,本篇我们介绍下springcloud中如何使用feign进行文件上传与下载。
还是使用feign进行http的调用。
一、Feign文件上传
服务提供方java代码:
/** *文件上传 *@paramfile文件 *@paramfileType *@return */ @RequestMapping(method=RequestMethod.POST,value="/uploadFile", produces={MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes=MediaType.MULTIPART_FORM_DATA_VALUE) publicStringuploadFile(@RequestPart(value="file")MultipartFilefile, @RequestParam(value="fileType")StringfileType, HttpServletRequestrequest,HttpServletResponseresponse){ System.out.println("fileType:"+fileType); longsize=file.getSize(); StringcontentType=file.getContentType(); Stringname=file.getName(); StringorgFilename=file.getOriginalFilename(); System.out.println("size:"+size); System.out.println("contentType:"+contentType); System.out.println("name:"+name); System.out.println("orgFilename:"+orgFilename); Stringsuffix=orgFilename.substring(orgFilename.lastIndexOf("."));//后缀 Stringuuid=UUID.randomUUID().toString().replaceAll("-","").toUpperCase(); Filedest=newFile("f:/b13/"+uuid+suffix); try{ file.transferTo(dest); returndest.getCanonicalPath();//文件的绝对路径 }catch(IllegalStateException|IOExceptione){ e.printStackTrace(); } return"failure"; }
服务提供方Feign api接口:
@RequestMapping(method=RequestMethod.POST,value="/uploadFile", produces={MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes=MediaType.MULTIPART_FORM_DATA_VALUE) publicStringuploadFile(@RequestPart(value="file")MultipartFilefile,@RequestParam(value="fileType")StringfileType);
服务消费方:
pom.xml
io.github.openfeign.form feign-form 3.0.3 io.github.openfeign.form feign-form-spring 3.0.3
java代码:
@Autowired privateUserProControllerApiuserProControllerApi; @ResponseBody @RequestMapping("/user_uploadFile") publicObjectuser_uploadFile(HttpServletRequestrequest,HttpServletResponseresponse, @RequestPart(value="file")MultipartFilefile,StringfileType){ System.out.println(fileType); returnuserProControllerApi.uploadFile(file,fileType); }
MultipartSupportConfig.java
@Configuration publicclassMultipartSupportConfig{ @Autowired privateObjectFactorymessageConverters; @Bean @Primary @Scope("prototype") publicEncoderfeignEncoder(){ returnnewSpringFormEncoder(newSpringEncoder(messageConverters)); } @Bean publicfeign.Logger.LevelmultipartLoggerLevel(){ returnfeign.Logger.Level.FULL; } }
二、Feign文件下载
服务提供方java代码:
/** *文件(二进制数据)下载 *@paramfileType文件类型 *@return */ @RequestMapping("/downloadFile") publicResponseEntitydownloadFile(StringfileType,HttpServletRequestrequest){ System.out.println(request.getParameter("fileType")); System.out.println("参数fileType:"+fileType); HttpHeadersheaders=newHttpHeaders(); ResponseEntity entity=null; InputStreamin=null; try{ in=newFileInputStream(newFile("d:/myImg/001.png")); byte[]bytes=newbyte[in.available()]; StringimageName="001.png"; //处理IE下载文件的中文名称乱码的问题 Stringheader=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=newString(imageName.getBytes(),"iso-8859-1"); } in.read(bytes); headers.add("Content-Disposition","attachment;filename="+imageName); entity=newResponseEntity (bytes,headers,HttpStatus.OK); }catch(Exceptione){ e.printStackTrace(); }finally{ if(in!=null){ try{ in.close(); }catch(IOExceptione){ e.printStackTrace(); } } } returnentity; }
服务提供方feign api接口
@RequestMapping("/downloadFile") publicResponseEntitydownloadFile(@RequestParam(value="fileType")StringfileType );
服务消费方
@ResponseBody @RequestMapping("/user_downloadFile") publicObjectuser_downloadFile(HttpServletRequestrequest,HttpServletResponseresponse, StringfileType){ ResponseEntityentity=userProControllerApi.downloadFile(fileType); System.out.println(entity.getStatusCode()); returnentity; }
注:实际项目中如果上传的文件太大,可以使用ftp服务器保存上传的文件,直接在controller端调用ftp接口即可。
如果下载的文件太大,则调用service端接口可返回一个ftp文件资源路径,然后在controller端调用ftp下载文件即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。