Gitee仓库
https://gitee.com/Lin_DH/system
介绍
文件上传是指将本地的图片、视频、音频等文件上传到服务器,供其他用户浏览下载的过程,文件上传在日常项目中用的非常广泛。
实现代码
第一步:在配置文件新增如下配置
application.yml
spring:
servlet:
multipart:
max-file-size: 10MB #默认为1MB
max-request-size: 10MB #默认为10MB
file:
upload:
path: F:/files/
第二步:编写文件上传页面
upload.html
<!DOCTYPE html>
<html lang="en">
<head lang="en">
<meta charset="UTF-8" />
<title>文件上传页面</title>
</head>
<body>
<h1>文件上传页面</h1>
<form method="post" action="/upload" enctype="multipart/form-data">
选择要上传的txt格式文件:<input type="file" name="file"><br>
<hr>
<input type="submit" value="提交">
</form>
</body>
</html>
第三步:编写文件上传页面和对应接口
FileController.java
package com.lm.system.controller;
import com.lm.system.exception.FileException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
/**
* @author DUHAOLIN
* @date 2024/10/15
*/
@Controller
public class FileController {
private final static String FILE_FORMAT_TXT = "txt";
@Value("${file.upload.path}")
private String path;
@GetMapping("uploadPage")
public String uploadPage() {
return "upload";
}
@PostMapping("upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) throws IOException {
//校验文件
try {
String[] fileFormats = { FILE_FORMAT_TXT };
checkFile(file, fileFormats);
} catch (FileException e) {
e.printStackTrace();
return e.getMessage();
}
String filename = path + file.getOriginalFilename().replace(FILE_FORMAT_TXT, "_" + System.currentTimeMillis() + FILE_FORMAT_TXT);
File newFile = new File(filename);
Files.copy(file.getInputStream(), newFile.toPath());
return "新文件已生成," + newFile.getAbsolutePath();
}
private void checkFile(MultipartFile file, String[] fileFormats) {
//校验文件大小
checkSize(file.getSize());
//校验文件名
checkFilename(file.getOriginalFilename());
//校验文件格式
checkFileFormat(file.getOriginalFilename(), fileFormats);
}
private void checkSize(long size) {
if (size > 10485760L) //10MB
throw new FileException("文件大于10MB");
}
private void checkFilename(String filename) {
if (!StringUtils.hasText(filename))
throw new FileException("文件名有误");
}
private void checkFileFormat(String filename, String[] fileFormats) {
int i = filename.lastIndexOf(".");
String suffix = filename.substring(i + 1); //文件后缀
long c = Arrays.stream(fileFormats).filter(s -> s.equals(suffix)).count(); //判断是否存在该文件后缀
if (c < 1) throw new FileException("文件格式有误,该文件类型为:" + suffix);
}
}
第四步:添加文件异常类
FileException.java
package com.lm.system.exception;
/**
* @author DUHAOLIN
* @date 2024/10/15
*/
public class FileException extends RuntimeException {
public FileException() {
super();
}
public FileException(String message) {
super(message);
}
public FileException(String message, Throwable cause) {
super(message, cause);
}
}
效果图
上传不正确的非 .txt 格式的文件
上传确认的 .txt 文件