springcloud中feign檔案上傳、下載
檔案上傳、下載也是實際專案中會遇到的場景,本篇我們介紹下springcloud中如何使用feign進行檔案上傳與下載 。
還是使用feign 進行http的呼叫。
一、Feign檔案上傳
服務提供方java程式碼:
/**
* 檔案上傳
* @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";
}
服務提供方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);
服務消費方:
pom.xml
<!-- 引入檔案feign檔案上傳依賴 -->
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.0.3</version>
</dependency>
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 ObjectFactory<HttpMessageConverters> messageConverters;
@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檔案下載
服務提供方java程式碼:
/**
* 檔案(二進位制資料)下載
* @param fileType 檔案型別
* @return
*/
@RequestMapping("/downloadFile")
public ResponseEntity<byte[]> downloadFile(String fileType,HttpServletRequest request ){
System.out.println(request.getParameter("fileType"));
System.out.println("引數fileType: "+fileType);
HttpHeaders headers = new HttpHeaders();
ResponseEntity<byte[]> 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<byte[]>(bytes, headers, HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(in!=null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return entity;
}
服務提供方feign api介面
@RequestMapping("/downloadFile")
public ResponseEntity<byte[]> downloadFile(@RequestParam(value = "fileType") String fileType
);
服務消費方
@ResponseBody
@RequestMapping("/user_downloadFile")
public Object user_downloadFile(HttpServletRequest request,HttpServletResponse response,
String fileType) {
ResponseEntity<byte[]> entity = userProControllerApi.downloadFile(fileType);
System.out.println( entity.getStatusCode());
return entity ;
}
注:實際專案中如果上傳的檔案太大,可以使用ftp伺服器儲存上傳的檔案,直接在controller端呼叫ftp介面即可。
如果下載的檔案太大,則呼叫service端介面可返回一個ftp檔案資源路徑,然後在controller端呼叫ftp下載檔案即可。
~~
相關文章
- Feign實現檔案上傳下載
- spring cloud feign 檔案上傳和檔案下載SpringCloud
- SpringCloud 通過feign檔案傳輸並打zip包下載SpringGCCloud
- 檔案上傳下載
- springCloud 微服務通過minio實現檔案上傳和檔案下載介面SpringGCCloud微服務
- springboot 中檔案的上傳和下載Spring Boot
- JAVA檔案上傳下載Java
- springboot 檔案上傳下載Spring Boot
- 檔案上傳與下載
- 使用SecureCRT上傳下載檔案Securecrt
- minio檔案上傳與下載
- 檔案的上傳與下載
- SpringMVC檔案上傳下載(單檔案、多檔案)SpringMVC
- Netty接收HTTP檔案上傳及檔案下載NettyHTTP
- Spring Cloud Feign的檔案上傳實現SpringCloud
- java 上傳 下載檔案工具類Java
- 檔案下載上傳小工具
- 檔案上傳下載小工具
- Spring Boot 檔案上傳與下載Spring Boot
- xshell 使用 sftp上傳下載檔案FTP
- 檔案上傳/下載後臺程式碼
- SpringMVC實現檔案上傳&下載(2)SpringMVC
- Struts2的檔案上傳下載
- xshell安裝上傳下載檔案命令
- 【liunx命令】上傳下載檔案的方法
- Koa2 之檔案上傳下載
- 精講RestTemplate第6篇-檔案上傳下載與大檔案流式下載REST
- 使用Vue+go實現前後端檔案的上傳下載,csv檔案上傳下載可直接照搬VueGo後端
- 基於SpringWeb MultipartFile檔案上傳、下載功能SpringWeb
- 前端實現檔案下載和拖拽上傳前端
- Java SE 檔案上傳和檔案下載的底層原理Java
- 一文讀懂SpringMVC中的檔案上傳與下載SpringMVC
- 檔案傳輸中,上傳、下載速度和預期有差距如何解決?
- 大檔案傳輸解決方案:分片上傳 / 下載限速
- MinIO上傳和下載檔案及檔案完整性校驗.
- Python介面自動化——檔案上傳/下載介面Python
- vue實現Excel檔案的上傳與下載VueExcel
- JavaWeb之實現檔案上傳與下載工具JavaWeb