【博学谷学习记录】超强总结,用心分享 | 文件系统本地存储service实现

#博学谷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父文件夹名称
groupFastDFS组,用于FasftDFS存储方式
pathFastDFS远程文件名
relativePath文件的相对路径
fileMd5md5值
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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值