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();
ResponseEntityentity=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下载文件即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。