#博学谷IT技术支持#
前言
本章节包含基于Springboot的本地存储功能文件系统的实现逻辑。
该项目包含了抽象类需要包含文件上传抽象方法,需要由子类实现。
1.AbstractFileStrategy通用方法upload定义
1.1 获取文件名
// 获取文件名
String originalFilename = multipartFile.getOriginalFilename();
if (!originalFilename.contains(FILE_SPLIT)) {
throw BizException.wrap(ExceptionCode.BASE_VALID_PARAM.build("上传文件"));
}
1.2 封装自定义File对象,完成文件上传后需要将文件信息保存到数据库
dataType | 数据类型(目录,图片,食品,音频,文档,其他) |
submittedFileName | 原始文件名 |
treepath | 父目录层级关系 |
grade | 层级等级 |
isDelete | 是否删除 |
folderId | 父文件夹ID |
url | 文件访问链接,需要通过nginx配置路由才能访问 |
size | 文件大小,单位字节 |
folderName | 父文件夹名称 |
group | FastDFS组,用于FasftDFS存储方式 |
path | FastDFS远程文件名 |
relativePath | 文件的相对路径 |
fileMd5 | md5值 |
contextType | 文件类型 |
fileName | 唯一文件名 |
ext | 文件名后缀 |
icon | 文件图标,用于云盘显示 |
createMonth | 创建时年月 |
createWeek | 创建时年周 |
createDay | 创建时年月日 |
source | 文件来源 |
// 封装File对象,完成文件上传后需要将文件信息保存到数据库
File file = File.builder()
.isDelete(false) //文件是否被删除
.size(multipartFile.getSize()) //文件大小
.contextType(multipartFile.getContentType()) //文件类型
.dataType(FileDataTypeUtil.getDataType(multipartFile.getContentType())) //数据类型
.submittedFileName(multipartFile.getOriginalFilename()) //原始文件名称
.ext(FilenameUtils.getExtension(multipartFile.getOriginalFilename())) //文件后缀
.build();
// 设置文件的图标
file.setIcon(IconType.getIcon(file.getExt()).getIcon());
LocalDateTime now = LocalDateTime.now();
// 设置文件创建时间
file.setCreateMonth(DateUtils.formatAsYearMonthEn(now));
file.setCreateWeek(DateUtils.formatAsYearWeekEn(now));
file.setCreateDay(DateUtils.formatAsDateEn(now));
1.3 调用uploadFile抽象方法
uploadFile(file, multipartFile);
2.本地上传实现类uploadFile方法
2.1 生成文件名
// 生成文件名
String fileName = UUID.randomUUID() + StrPool.DOT + file.getExt();
2.2 日期目录:2022\06
使用Paths为避免不同操作系统目录斜线与反斜线产生目录结构出错。
// 日期目录:2022\06
String relativePath = Paths.get(LocalDateTime.now().format(DateTimeFormatter.ofPattern(DateUtils.DEFAULT_MONTH_FORMAT_SLASH))).toString();
2.3 文件绝对路径:D:\uploadFiles\oss-file-service\2022\06
endpoint:D:\uploadFiles
bucketName:oss-file-service
relativePath:2022\06
String absolutePath = Paths.get(endpoint, bucketName, relativePath).toString();
2.4 目标输出文件
// 目标输出文件
java.io.File outFile = new java.io.File(Paths.get(absolutePath, fileName).toString());
2.5 向目标文件写入数据
FileUtils.writeByteArrayToFile(outFile, multipartFile.getBytes());
2.6 文件上传完成后需要设置File对象的属性,用于保存到数据库
// http://ip:host/oss-file-service/2022/06/xxx.doc
String url = new StringBuilder(getUriPrefix())
.append(StrPool.SLASH)
.append(bucketName)
.append(StrPool.SLASH)
.append(relativePath)
.append(StrPool.SLASH)
.append(fileName)
.toString();
url = StrUtil.replace(url, "\\\\", StrPool.SLASH);
url = StrUtil.replace(url, "\\", StrPool.SLASH);
file.setUrl(url);
file.setFilename(fileName);
file.setRelativePath(relativePath);