开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情
前言
在后端处理文件上传的时候,我们通上传文件的时候,一般这个路径不会随便写。
比如这篇文章中的路径:解决SpringBoot文件上传报错:org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException
我当时就想着随便写一个路径进行测试,所以临时定义了一个路径,其实这样的是不对的。
正确的做法是是将路径配置成一个统一的地址,我们通过获取配置项得到地址,然后进行逻辑操作。
配置全局上传路径 配置全局上传路径,其实很简单,需要借助一个配置项:
我没有云服务器,这里以自己的电脑的某个文件夹为例
文件上传路径
file.uploadFolder=D:/upload/
其实就是这里:
读取配置 配置完之后呢,我们需要在对应的地方获取该配置项,获取配置项的方式很简单,通过@value注解即可实现,它的值就是配置项的key
注意:
@value注解是springframework包下面的,可不要用错了! import org.springframework.beans.factory.annotation.Value;
// 文件上传路径,从配置项获取
@Value("${file.uploadFolder}")
private String basePath;
动态获取到配置项之后,我们就可以进行逻辑处理了。这里以文件上传为例,简单的演示以下
package com.wyh.controller;
import cn.hutool.core.util.RandomUtil;
import com.wyh.common.Result;
import com.wyh.entity.User;
import com.wyh.service.impl.IUserServiceImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
/**
* @Description: 用户控制器
* @Author: 魏一鹤
* @Date: 2022-11-30 22:47
**/
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
IUserServiceImpl userService;
// 文件上传路径,从配置项获取
@Value("${file.uploadFolder}")
private String basePath;
/**
* @Author 魏一鹤
* @Description 上传文件
* @Date 21:12 2023/2/5
**/
@PostMapping("/upload")
public Result upload(MultipartFile file) {
// 原文件
if (file == null) {
return Result.fail("请选择文件!");
}
// 原文件名
String originalFilename = file.getOriginalFilename();
// 原文件后缀
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
Calendar calendar = Calendar.getInstance();
// 当前年份,用于拼接文件上传路径
String year = String.valueOf(calendar.get(Calendar.YEAR));
// 当前月份,注意加1,用于拼接文件上传路径
String month = String.valueOf(calendar.get(Calendar.MONTH) + 1);
String day = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));
// 新的文件名称
/*
* 方案1 新的文件名称:uuid+"_"+源文件名称 String newFileName = UUID.randomUUID().toString() + "_" + originalFilename;
* 方案2 新的文件名称:当前年+"_"+月 "_"+日+"_"+随机六位数+"_"+源文件名称 String newFileName = year + "_"+ month + "_"+day + "_" + RandomUtil.randomNumbers(6) + "_" + originalFilename;
* 这里选择的是方案2
**/
String newFileName = year + "_" + month + "_" + day + "_" + RandomUtil.randomNumbers(6) + "_" + originalFilename;
// 文件路径
String filePath = basePath + newFileName;
//创建一个目录对象
File dir = new File(basePath);
//判断当前目录是否存在
if (!dir.exists()) {
//目录不存在,需要创建
dir.mkdirs();
} //将临时文件转存到指定位置
try {
file.transferTo(new File(filePath));
} catch (IOException e) {
e.printStackTrace();
}
return Result.ok(filePath);
}
}
测试效果
代码写完之后,就可以测试下了
正常上传过来了: