一.获取上传路径
1.首先 在配置类(application.yml)里配置了上传的路径
目前放在了 D:/filePath/springBoot-shiro/uploadPath下
profile:
filePath: D:/filePath/springBoot-shiro/uploadPath
2.上传路径获取
/**
* Description:获取文件的父级路径
*
* @Author: yangyanbin
* @Date: Created in 2019/12/13 16:16
*/
@Component
public class FilePathUtil {
public static String FILE_PATH;
@Value("${profile.filePath}")
public void setPageSize(String filePath) {
FILE_PATH = filePath;
}
}
这样 获取路径可以直接 类名点静态属性 而不是通过注入
3.调用方法
在文件上传类中使用 静态属性获取
/**
* 文件绝对路径
*/
public static String FILE_PATH = FilePathUtil.FILE_PATH;
二.上传
/**
* 文件上传操作
*
* @param file 文件
* @throws IOException
*/
private static void upload(MultipartFile file) throws IOException {
OutputStream out = null;
try {
byte[] bytes = file.getBytes();
//文件校验
fileCheck(file);
//存储到服务器的文件名(新文件名)
String newFileName = encodingFilename(file.getOriginalFilename());//对名字的操作
File desc = getAbsoluteFile(String.format("%s/%s", FILE_PATH, newFileName));//创建文件
out = new FileOutputStream(desc);//输出流
out.write(bytes);
} catch (BaseException e) {
logger.warn(String.format("上传异常【系统异常】,消息:%s", e.getMessage()));
throw e;
} catch (Exception e) {
logger.warn(String.format("上传异常【应用异常】,消息:%s", e.getMessage()));
throw e;
} finally {
if (out != null) {
out.close();
}
}
}
2.文件校验
/**
* 文件校验 文件名称长度校验 后缀名校验 文件大小校验
*
* @param file
*/
private static void fileCheck(MultipartFile file) {
//文件名称长度校验
int fileNamelength = file.getOriginalFilename().length();
if (fileNamelength > DEFAULT_FILE_NAME_LENGTH) {
throw new BaseException("附件名长度不能超过:" + DEFAULT_FILE_NAME_LENGTH);
}
//后缀名校验 !exe
String suffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
if (suffixName.equals("exe")) {
throw new BaseException("不能上传exe结尾的可执行文件!");
}
//文件大小校验
long size = file.getSize();
if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) {
throw new BaseException(String.format("附件大小不能超过%sMB", DEFAULT_MAX_SIZE / 1024 / 1024));
}
}
3.文件标识名称 格式为 “yyyyMMddHHmmssSS”
/**
* 返回新文件名文件标识名称 格式为 "yyyyMMddHHmmssSS"
* (服务器上的 重新生成的名字(时间戳))
* @param fileName (原文件名称)
* @return 返回 /年/月/文件名.后缀名 的路径
*/
private static final String encodingFilename(String fileName) {
String newFileName = DateUtils.parseDateToStr("yyyyMMddHHmmssSS", Calendar.getInstance().getTime());//获取当前时间戳
String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1);//后缀名称
Calendar date = Calendar.getInstance();
String year = String.valueOf(date.get(Calendar.YEAR));//当前年
int month = date.get(Calendar.MONTH) + 1; //当前月份
//附件数据表
return String.format("%s/%s/%s.%s", year, month, newFileName, suffixName);
}
4.如果没有文件创建文件
/**
* 如果没有文件创建文件
*
* @param absolutePath 绝对路径
* @return
* @throws IOException
*/
private static final File getAbsoluteFile(String absolutePath) throws IOException {
File desc = new File(File.separator + absolutePath);
if (!desc.getParentFile().exists()) {
desc.getParentFile().