最近有個需求,接收用戶上報的證書,並且保存起來,證書大小不到1M,但該證書的保存必須在另外一個程序進行,所以想到使用springboot接收上傳文件后,再通過RestTemplate將文件發送給另外一個程序來處理,假設我們定義接收從頁面中上傳的文件並發送給另外一個程序的服務稱之為客戶端,接收客戶端發送的文件的服務稱之為服務端
pom依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 保存文件所需的工具類 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
客戶端
頁面
客戶端使用了freemarker顯示上傳界面,pom文件添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
uploadFile.ftl
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title></title> </head> <body> <form name="fileForm" method="post" action="/test/upload" enctype="multipart/form-data"> name: <input type="text" name="uploader"><br/> file:<input type="file", name="uploadFile"> <input type="submit" id = "submit"> </form </body> </html>
接收頁面上傳文件
package com.demo.bootdemo; import java.util.Map; import javax.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.ByteArrayResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping("/test") public class UploadFileController { private Logger logger = LoggerFactory.getLogger(UploadFileController.class); @Resource private RestTemplate restTemplate; @RequestMapping("toUploadPage") public String toUploadPage() { return "uploadFile"; } @PostMapping("upload") @ResponseBody public Object upload(MultipartFile uploadFile, String uploader) { MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>(); HttpHeaders header = new HttpHeaders(); header.setContentType(MediaType.MULTIPART_FORM_DATA); HttpHeaders fileHeader = new HttpHeaders(); fileHeader.setContentType(MediaType.parseMediaType(uploadFile.getContentType())); fileHeader.setContentDispositionFormData("uploadFile", uploadFile.getOriginalFilename()); Map result = null; try { HttpEntity<ByteArrayResource> fileEntity = new HttpEntity<>(new ByteArrayResource(uploadFile.getBytes()), fileHeader); multiValueMap.add("uploadFile", fileEntity); multiValueMap.add("uploader", uploader); String url = "http://127.0.0.1:8082/rest/createFile"; HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(multiValueMap, header); ResponseEntity<Map> postForEntity = restTemplate.postForEntity(url, httpEntity, Map.class); result = postForEntity.getBody(); } catch (Exception e) { logger.error("", e); } return result; } }
服務器端
接收文件
package com.demo.bootdemo; import java.io.File; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping("/rest") public class CreateFileController { private Logger logger = LoggerFactory.getLogger(CreateFileController.class); @PostMapping("createFile") @ResponseBody public Map<String, Object> createFile(MultipartFile uploadFile, String uploader) { String message = ""; boolean success = true; try { FileUtils.copyInputStreamToFile(uploadFile.getInputStream(), new File("G:\\rest\\" + uploadFile.getOriginalFilename())); } catch (Exception e) { logger.error("", e); message = e.getMessage(); success = false; } Map<String, Object> result = new HashMap<>(); result.put("message", message); result.put("success", success); return result; } }
備注
如果傳遞的文件過大,比如說超過了10M,則需要修改如下兩個參數(單位Byte),但一般通過http上傳的文件不要太大,如果太大,可以考慮使用ftp方式上傳
## default 1M spring.servlet.multipart.max-file-size=8000000000 ## default 10M spring.servlet.multipart.max-request-size=8000000000