承接之前的博文”springboot maven+layui上传文件“,文件上传到远端服务器,并返回用于存储数据库需要的文件服务器存储路径和文件大小。
pom.xml 依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
这里把请求远端服务器上传文件的方法作为一个工具类,降低代码的重复性,减少内存资源的消耗,增加代码的拓展性
- uploadUrl 服务器上传接口地址
- LinkedMultiValueMap 一个键对应多个值(添加一个Key对应多个Value:void add(K, List))
public String serverUpload(String tempFilePath) {
JSONObject jsonObject = null;
// 设置请求头
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("multipart/form-data");
headers.setContentType(type);
// 设置请求体,注意是LinkedMultiValueMap
FileSystemResource resource = new FileSystemResource(tempFilePath);
MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
form.add("files", resource);
HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
// 跨域请求服务器,返回jsonObject
ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(uploadUrl, files, JSONObject.class);
jsonObject = responseEntity.getBody();
// 获得文件在服务器的 url
List<String> List = new ArrayList<>();// 文件链接列表
String data = "";
if ((Integer) jsonObject.get("statusCode") == 200) {
// List = (List<String>) jsonObject.get("data");
// src = List.get(0);
data = jsonObject.get("data").toString();
}
return data.substring(1, data.length() - 1);
// return src;
}
文件格式化工具,获得文件大小
public String formateFileSize(int size) {
double s = size + 0.0;
String fileSize = null;
if (size >= 1048576) {
fileSize = formateDouble(s / 1048576.0) + "M";
} else if (size < 1024) {
fileSize = formateDouble(s) + "B";
} else {
fileSize = formateDouble(s / 1024.0) + "K";
}
return fileSize;
}
public String formateDouble(double value){
DecimalFormat df = new DecimalFormat("#.00");
return df.format(value);
}
简单编写一个 controller 测试一下上传一张图片,并返回图片的远程路由。
- System.getProperty("java.io.tmpdir") 获取系统临时目录,Java输入输出临时路径
- file.transferTo(tempFile) 写入文件到临时路径,能写入再调用服务器接口上传
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public String uploadGroupFile(HttpServletRequest request, @RequestParam("file") MultipartFile file) {
//判断是否允许普通成员上传文件
int size = (int) file.getSize();
//50MB
if (size > 52428800L) {
return jsonResult.error(201, "上传文件过大,最大为50MB");
}
// 获取文件名
String originalFilename = file.getOriginalFilename();
if (StringUtils.isBlank(originalFilename)) {
return "文件名不能为空";
}
// 创建临时文件
String tempFilePath = System.getProperty("java.io.tmpdir") + originalFilename;
File tempFile = new File(tempFilePath);
try {
file.transferTo(tempFile);//上传文件
} catch (IOException e) {
e.printStackTrace();
return "文件上传失败!!!";
}
//没有出错则调用文件上传接口
String url = fileUtil.serverUpload(tempFilePath);
if (tempFile.exists()) {
tempFile.delete();// 删除临时文件
}
// 格式化文件大小
String fileSize = myFileUtil.formateFileSize(size);
// 数据库操作...
return url;
}
运行项目用 postman 简单测试一下接口,结果如下: