SpringBootRestTemplate接收⽂件,并将⽂件发送到另外⼀个
程序进⾏存储
最近有个需求,接收⽤户上报的证书,并且保存起来,证书⼤⼩不到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 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 = Logger(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.ContentType()));
fileHeader.setContentDispositionFormData("uploadFile", OriginalFilename());
Map result = null;
try {
HttpEntity<ByteArrayResource> fileEntity = new HttpEntity<>(new Bytes()),                    fileHeader);
multiValueMap.add("uploadFile", fileEntity);
multiValueMap.add("uploader", uploader);
String url = "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 = Body();
} catch (Exception e) {
<("", e);
}
return result;
}
}
服务器端
接收⽂件
inputtypefile不上传文件package com.demo.bootdemo;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.apachemons.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 = Logger(CreateFileController.class);
@PostMapping("createFile")
@ResponseBody
public Map<String, Object> createFile(MultipartFile uploadFile, String uploader) {
String message = "";
boolean success = true;
try {
new File("G:\\rest\\" + OriginalFilename()));
} catch (Exception e) {
<("", 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