spring boot 文件上传与访问

这篇文章主要讲解 spring boot如何上传文件

直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package com.test.file.controller;

import com.test.code.R;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Slf4j
@RestController
public class FileController {

// like D:/data/
@Value("${web.upload-path}")
private String uploadPath;

// 允许上传的文件扩展名
private static final String[] ALLOW_EXTENSIONS = new String[]{
// 图片
"jpg", "jpeg", "png", "gif", "bmp",
// 压缩包
"zip", "rar", "gz", "7z", "cab",
// 音视频,
"wav", "avi", "mp4", "mp3", "m3u8", "ogg", "wma", "wmv", "rm", "rmvb", "aac", "mov", "asf", "flv",
// 文档
"doc", "docx", "xls", "xlsx", "ppt", "pptx", "pot", "txt", "csv", "md", "pdf"
};

/**
* 判断文件名是否允许上传
*
* @param fileName 文件名
* @return
*/
public boolean isAllow(String fileName) {
String ext = FilenameUtils.getExtension(fileName).toLowerCase();
for (String allowExtension : ALLOW_EXTENSIONS) {
if (allowExtension.toLowerCase().equals(ext)) {
return true;
}
}
return false;
}

@PostMapping("/upload")
public R upload(HttpServletRequest request, @RequestParam("file") MultipartFile uploadFile) {

String fileName = uploadFile.getOriginalFilename();
if (isAllow(fileName)) {
// 在 uploadPath 文件夹中通过日期对上传的文件归类保存
// 比如:/2019/06/06/cf13891e-4b95-4000-81eb-b6d70ae44930.png
String format = new SimpleDateFormat("yyyy/MM/dd/").format(new Date());
File folder = new File(uploadPath + format);
if (!folder.isDirectory()) {
folder.mkdirs();
}

// 对上传的文件重命名,避免文件重名
String newName = UUID.randomUUID() + fileName.substring(fileName.lastIndexOf("."));
try {
// 文件保存
uploadFile.transferTo(new File(folder.getAbsolutePath(), newName));
// 返回上传文件的访问路径
String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/" + format + newName;
log.info("url:[{}]", url);
return R.ok().addData("url", url);
} catch (IOException e) {
log.error("upload file failure.", e);
return R.error(R.ERROR).message("文件上传失败");
}
}
return R.error(R.PARAM_ERROR).message("文件格式不正确");
}


}

application.yml

1
2
3
4
5
6
web:
upload-path: /data/
spring:
web:
resources:
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.13.0</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>