工具类:
/**
* 文件上传本地服务器工具类
*
* @Author:H
* @Date :2024/8/16 9:30
*/
@Slf4j
public class FileUploadUtils {
/**
* 单文件上传
* 上传到指定路径
* @param file 上传的文件
* @param dir 分配的存放路径(商品:goods)
*/
public static Result<UploadFileVO> upload(MultipartFile file, String dir) {
if(file.isEmpty()) {
return Result.fail("上传文件不能为空");
}
log.debug("LocalUploadConfig.getMaxSize():{}"+LocalUploadConfig.getMaxSize());
log.debug(" LocalUploadConfig.getPatchPrefix():{}"+ LocalUploadConfig.getPrefix());
if(LocalUploadConfig.getMaxSize() != null && LocalUploadConfig.getMaxSize() > 0) {//文件大小
long size = file.getSize();
if(size > LocalUploadConfig.getMaxSize() * 1024 * 1024) {
return Result.fail("上传文件大小不能超过" + LocalUploadConfig.getMaxSize() + "MB!");
}
}
//获取当前时间年/月/日
String date = DateUtil.format(DateUtil.date(), "yyyy/MM/dd");
// 文件保存路径
String savePath = LocalUploadConfig.getPrefix() + File.separator + dir + File.separator + date;
if(savePath == null || "".equals(savePath.trim())) {
return Result.fail("上传文件失败:存放路径为空!");
}
//创建存放目录
File saveFiles=new File(savePath);
if(!saveFiles.exists()){
saveFiles.mkdirs();//创建文件夹,如果上级目录不存在,则挨个创建目录
}
//原始文件名
String originalName = file.getOriginalFilename();
// 获取原始文件名的后缀
String extension = originalName.substring(originalName.lastIndexOf('.') + 1);
// 构建新文件名
String newFileName = IdUtil.simpleUUID() + "." + extension;
//指定需要保存的文件名称和路径
File saveFile = FileUtil.newFile(savePath + File.separator + newFileName);
try {
// file.transferTo(saveFile);//保存文件到指定目录
FileUtil.writeBytes(file.getBytes(), saveFile);
String url = "/" + dir + "/" + date+"/"+newFileName;
UploadFileVO uploadFileVO = new UploadFileVO();
uploadFileVO.setUrl(url);
uploadFileVO.setNewFileName(newFileName);
uploadFileVO.setOriginalFilename(originalName);
uploadFileVO.setUploadTime(LocalDateTime.now());
return Result.success("文件上传成功", uploadFileVO);
} catch (Exception e) {
log.error("文件保存到临时目录失败!" + e.getMessage());
return Result.fail("文件保存到临时目录失败!" + e.getMessage());
}
}
/**
* 多文件上传
* @param files 上传的文件
* @param dir 分配的存放路径(商品:goods)
* @return
*/
public static Result<List<UploadFileVO>> uploads(MultipartFile[] files, String dir){
List<UploadFileVO> uploadFileList = new ArrayList<>();
for (MultipartFile file : files) {
if(file.isEmpty()) {
return Result.fail("上传文件不能为空");
}
if(LocalUploadConfig.getMaxSize() != null && LocalUploadConfig.getMaxSize() > 0) {//文件大小
long size = file.getSize();
if(size > LocalUploadConfig.getMaxSize() * 1024 * 1024) {
return Result.fail("上传文件大小不能超过" + LocalUploadConfig.getMaxSize() + "MB!");
}
}
//获取当前时间年/月/日
String date = DateUtil.format(DateUtil.date(), "yyyy/MM/dd");
// 文件保存路径
String savePath = LocalUploadConfig.getPrefix() + File.separator + dir + File.separator + date;
if(savePath == null || "".equals(savePath.trim())) {
return Result.fail("上传文件失败:存放路径为空!");
}
//创建存放目录
File saveFiles=new File(savePath);
if(!saveFiles.exists()){
saveFiles.mkdirs();//创建文件夹,如果上级目录不存在,则挨个创建目录
}
//原始文件名
String originalName = file.getOriginalFilename();
// 获取原始文件名的后缀
String extension = originalName.substring(originalName.lastIndexOf('.') + 1);
// 构建新文件名
String newFileName = IdUtil.simpleUUID() + "." + extension;
//指定需要保存的文件名称和路径
File saveFile = FileUtil.newFile(savePath + File.separator + newFileName);
try {
// file.transferTo(saveFile);//保存文件到指定目录
FileUtil.writeBytes(file.getBytes(), saveFile);
String url = "/" + dir + "/" + date+"/"+newFileName;
UploadFileVO uploadFileVO = new UploadFileVO();
uploadFileVO.setUrl(url);
uploadFileVO.setNewFileName(newFileName);
uploadFileVO.setOriginalFilename(originalName);
uploadFileVO.setUploadTime(LocalDateTime.now());
uploadFileList.add(uploadFileVO);
} catch (Exception e) {
log.error("文件保存到临时目录失败!" + e.getMessage());
return Result.fail("文件保存到临时目录失败!" + e.getMessage());
}
}
return Result.success("文件上传成功", uploadFileList);
}
/**
* 删除文件
* @param filePath 文件路径
* @return
*/
public static Result delete(String filePath){
if(filePath == null || "".equals(filePath.trim())) {
return Result.fail("删除文件失败:文件路径为空!");
}
File file = new File( LocalUploadConfig.getPrefix() + filePath);
if(!file.exists()){
return Result.fail("删除文件失败:文件不存在!");
}
if(file.isDirectory()){
return Result.fail("删除文件失败:文件路径为目录!");
}
if(file.delete()){
return Result.success("删除文件成功");
}else{
return Result.fail("删除文件失败");
}
}
}
配置类:
/**
* 本地文件上传相关配置
*
* @Author:H
* @Date :2024/8/15 19:47
*/
@Component
@ConfigurationProperties(prefix = "uploadlocal")
public class LocalUploadConfig {
/**
* 文件上传路径
*/
private static String prefix;
private static Integer maxSize;
public static String getPrefix() {
return prefix;
};
public void setPrefix(String prefix) {
LocalUploadConfig.prefix = prefix;
};
public static Integer getMaxSize() {
return maxSize;
};
public void setMaxSize(Integer maxSize) {
LocalUploadConfig.maxSize = maxSize;
};
}
配置文件:
#文件上传到本地服务器配置
uploadlocal:
#文件上传路径前缀
prefix: src/main/resources/static/uploadFile
#文件上传大小MB
maxSize: 30
接口类:
/**
* 文件上传接口
*/
@RestController
@RequestMapping("/file")
public class FileController {
/**
* 通用上传请求(单个)
* @param file 文件
* @param dir 存放路径(例子:商品:goods;店铺:shop)
* @return
* @throws Exception
*/
@PostMapping("/upload")
@SaIgnore
public Result<UploadFileVO> uploadFile(MultipartFile file, String dir) throws Exception
{
return FileUploadUtils.upload(file,dir);
}
/**
* 通用上传请求(多个)
* @param files 文件ls
* @param dir 存放路径(例子:商品:goods;店铺:shop)
* @return
* @throws Exception
*/
@PostMapping("/uploads")
@SaIgnore
public Result<List<UploadFileVO>> uploadFiles(MultipartFile[] files, String dir) throws Exception
{
return FileUploadUtils.uploads(files,dir);
}
/**
* 删除文件
* @param filePath 文件存放路径
* @return
*/
@GetMapping("/delete")
public Result delete(String filePath)
{
return FileUploadUtils.delete(filePath);
}
}
资源映射:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
//跨域支持配置
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 匹配所有路径
.allowedOrigins("*") // 允许所有源
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的HTTP方法
.allowedHeaders("*") // 允许所有头信息
//.allowCredentials(true) // 是否允许携带cookie,默认false
.maxAge(3600); // 预检请求的有效期,单位秒
}
@Value("${uploadlocal.prefix}")
private String prefix;
//映射浏览器可以直接访问的本地路径
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!prefix.endsWith(File.separator)) {
prefix = prefix + File.separator;
}
registry.addResourceHandler("/api/**").addResourceLocations("file:" + prefix);
}
}
成功返回示例:
{
"code": 200,
"message": "文件上传成功",
"data": {
"url": "//2024/08/20/78ede403bbcb47669aadf9a188b50317.wmv",
"newFileName": "78ede403bbcb47669aadf9a188b50317.wmv",
"originalFilename": "2D插值.wmv",
"uploadTime": "2024-08-20 14:55:09"
}
}
访问路径:(需要加上/api)
http://localhost:8080/api/test/2024/08/20/870da41dde1449279e85d8c03d36251e.jpg