最近有个需求,接收用户上报的证书,并且保存起来,证书大小不到1M,但该证书的保存必须在另外一个程序进行,所以想到使用springboot接收上传文件后,再通过RestTemplate将文件发送给另外一个程序来处理,假设我们定义接收从页面中上传的文件并发送给另外一个程序的服务称之为客户端,接收客户端发送的文件的服务称之为服务端
pom依赖
org.springframework.boot
spring-boot-starter-web
commons-io
commons-io
2.6
客户端
页面
客户端使用了freemarker显示上传界面,pom文件添加依赖
org.springframework.boot
spring-boot-starter-freemarker
uploadFile.ftl
name:
file:
接收页面上传文件
packagecom.demo.bootdemo;importjava.util.Map;importjavax.annotation.Resource;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.core.io.ByteArrayResource;importorg.springframework.http.HttpEntity;importorg.springframework.http.HttpHeaders;importorg.springframework.http.MediaType;importorg.springframework.http.ResponseEntity;importorg.springframework.stereotype.Controller;importorg.springframework.util.LinkedMultiValueMap;importorg.springframework.util.MultiValueMap;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.client.RestTemplate;importorg.springframework.web.multipart.MultipartFile;
@Controller
@RequestMapping("/test")public classUploadFileController {private Logger logger = LoggerFactory.getLogger(UploadFileController.class);
@ResourceprivateRestTemplate restTemplate;
@RequestMapping("toUploadPage")publicString toUploadPage() {return "uploadFile";
}
@PostMapping("upload")
@ResponseBodypublicObject upload(MultipartFile uploadFile, String uploader) {
MultiValueMap multiValueMap = new LinkedMultiValueMap<>();
HttpHeaders header= newHttpHeaders();
header.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpHeaders fileHeader= newHttpHeaders();
fileHeader.setContentType(MediaType.parseMediaType(uploadFile.getContentType()));
fileHeader.setContentDispositionFormData("uploadFile", uploadFile.getOriginalFilename());
Map result= null;try{
HttpEntity fileEntity = new HttpEntity<>(newByteArrayResource(uploadFile.getBytes()),
fileHeader);
multiValueMap.add("uploadFile", fileEntity);
multiValueMap.add("uploader", uploader);
String url= "http://127.0.0.1:8082/rest/createFile";
HttpEntity> httpEntity = new HttpEntity<>(multiValueMap, header);
ResponseEntity postForEntity = restTemplate.postForEntity(url, httpEntity, Map.class);
result=postForEntity.getBody();
}catch(Exception e) {
logger.error("", e);
}returnresult;
}
}
服务器端
接收文件
packagecom.demo.bootdemo;importjava.io.File;importjava.util.HashMap;importjava.util.Map;importorg.apache.commons.io.FileUtils;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.multipart.MultipartFile;
@Controller
@RequestMapping("/rest")public classCreateFileController {private Logger logger = LoggerFactory.getLogger(CreateFileController.class);
@PostMapping("createFile")
@ResponseBodypublic MapcreateFile(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 result = new HashMap<>();
result.put("message", message);
result.put("success", success);returnresult;
}
}
备注
如果传递的文件过大,比如说超过了10M,则需要修改如下两个参数(单位Byte),但一般通过http上传的文件不要太大,如果太大,可以考虑使用ftp方式上传
## default1M
spring.servlet.multipart.max-file-size=8000000000##default10M
spring.servlet.multipart.max-request-size=8000000000