这两天做一个小项目,负责了文件上传模块,后端使用的是spring boot,前端vue,我将文件保存在磁盘上
首先,在配置文件里对于文件上传的大小进行配置,因为spring 的默认配置文件上传大小差不多好象是1MB(这个只有模糊印象了,反正特别小),大小可以自己定义
spring.servlet.multipart.max-file-size=1024MB
spring.servlet.multipart.max-request-size=1024MB
然后你也可以将上传后保存的地址写道配置文件里,本人是新建了一个cofig类,规定了一些上传大小
public class UploadConfig {
//上传电影地址 windows系统
public static final String WINDOWS_UPLOAD_PATH = "D:/YouDaStorage/";
//上传电影地址 linux系统
public static final String LINUX_UPLOAD_PATH = "/home/deploy/YouDaStorage";
//上传电影封面指定大小 30MB
public static final long MAX_PHOTO_SIZE = 30 * 1024 * 1024;
//上传电影资源指定大小 5GB
public static final Long MAX_FILM_SIZE = 5 * 1024 * 1024 * 1024L;
//视频文件后缀为avi,mp4,mov,wmv,flv,MPEG
public static String getFilmSuffix(String fileName) {
if (org.apache.commons.lang.StringUtils.isBlank(fileName)) {
return null;
}
if (fileName.endsWith(".avi")) {
return ".avi";
}
if (fileName.endsWith(".mp4")) {
return ".mp4";
}
if (fileName.endsWith(".mov")) {
return ".mov";
}
if (fileName.endsWith(".wmv")) {
return ".wmv";
}
if (fileName.endsWith(".flv")) {
return ".flv";
}
if (fileName.endsWith(".MPEG")) {
return ".MPEG";
}
return null;
}
//照片后缀为jpg,png,jpeg
public static String getPhotoSuffix(String fileName) {
if (StringUtils.isBlank(fileName)) {
return null;
}
if (fileName.endsWith(".jpg")) {
return ".jpg";
}
if (fileName.endsWith(".png")) {
return ".png";
}
if (fileName.endsWith(".jpeg")) {
return ".jpeg";
}
return null;
}
}
接着就是service层了,我这个是在Windows系统下可以保存成功,但是mac系统下会报错,根据业务需求返回url或者其它的信息
public String uploadFilm(MultipartFile file) {
checkFilmFile(file);
//UUID防止文件重复,并去除多余符号
String fileName = UUID.randomUUID().toString() + file.getOriginalFilename();
fileName = fileName.replaceAll("-", "");
// 存储路径,windows
String path = WINDOWS_UPLOAD_PATH + fileName;
//创建文件路径
File dest = new File(path);
//判断文件是否存在
if (dest.exists()) {
return null;
}
//判断文件父目录是否存在
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdir();
}
try {
//上传文件
file.transferTo(dest);//保存文件
} catch (Exception e) {
e.printStackTrace();
return null;
}
//电影保存的路径即重新生成名称
return fileName;
}
其中checkFilm的检验函数
//判断视频大小以及格式
private void checkFilmFile(MultipartFile multipartFile) {
//判断文件大小的标志位
int flagSize = 0;
if (multipartFile.isEmpty()) {
throw new ServiceException("请选择文件上传");
}
//判断格式
String suffix = UploadConfig.getFilmSuffix(multipartFile.getOriginalFilename());
if (StringUtils.isEmpty(suffix)) {
throw new ServiceException("上传格式错误,请选择后缀为avi,mp4,mov的视频文件");
}
try {
InputStream inputStream = multipartFile.getInputStream();
if (inputStream.available() > UploadConfig.MAX_FILM_SIZE) {
flagSize = 1;
}
} catch (Exception e) {
e.printStackTrace();
}
if (flagSize == 1) {
throw new ServiceException("文件大小不能超过5GB");
}
}
然后直接在controller层调用就行。