当前位置: 首页 > article >正文

被上传文件于后端的命名策略

上一篇博客我们了解了前端上传的文件资源应该存放在后端项目中的什么位置,那么随之而来的另一个问题——我们应该如何为上传的文件命名呢?往往直接采用原文件名并不稳妥,会导致命名冲突、文件冲突、数据库管理冲突等多种问题,下面我介绍一些常用的文件命名策略。

在管理前端上传的文件时,文件命名策略非常重要。一个好的命名策略可以防止文件重名、便于管理和检索。以下是常见的文件命名策略:

1. UUID(通用唯一识别码)

使用 UUID(如 UUID.randomUUID().toString())来生成一个唯一的文件名。这样可以保证文件名不会重复,非常适合大多数场景。

示例:

String fileName = UUID.randomUUID().toString() + "." + fileExtension;

优点:

  • 文件名唯一,避免了重名冲突。

缺点:

  • 文件名较长,不便于人工识别。

2. 时间戳 + 随机数

将当前时间戳和随机数组合成文件名,如 System.currentTimeMillis()LocalDateTime.now()。加上随机数(如 Random 类生成的随机数字),可以进一步降低文件名冲突的风险。

示例:

String fileName = System.currentTimeMillis() + "_" + new Random().nextInt(1000) + "." + fileExtension;

优点:

  • 相对简洁,文件名冲突的可能性小。

缺点:

  • 在高并发场景下可能出现冲突。

3. 业务相关前缀 + UUID/时间戳

根据业务需求添加前缀,例如用户 ID、业务类型、日期等,再加上 UUID 或时间戳。这种方式便于根据文件名识别来源或用途,方便日后查找和管理。

示例:

String fileName = "user_" + userId + "_" + System.currentTimeMillis() + "." + fileExtension;

优点:

  • 文件名包含业务信息,便于分类和管理。

缺点:

  • 文件名可能较长,不适合所有情况。

4. 哈希文件名

将文件内容的哈希值(如 MD5SHA-256)作为文件名。此方法不仅确保文件名唯一,还可以避免重复存储相同内容的文件(例如上传相同的图片多次)。

示例:

String fileName = DigestUtils.md5DigestAsHex(fileContent) + "." + fileExtension;

优点:

  • 文件内容唯一标识,适合对文件去重。

缺点:

  • 需要读取文件内容并计算哈希值,稍微增加了计算开销。

5. 原始文件名 + UUID/时间戳

保留用户上传的文件原始名称的一部分,加上 UUID 或时间戳作为后缀。这种方式在需要保留文件部分原始信息的情况下比较有用。

示例:

String originalFileName = file.getOriginalFilename();
String fileName = originalFileName.substring(0, originalFileName.lastIndexOf('.'))
              + "_" + UUID.randomUUID().toString() + "." + fileExtension;

优点:

  • 保留了部分文件原始信息,便于识别。

缺点:

  • 原始文件名可能包含特殊字符,需要进一步处理。

总结建议

  • 常规文件存储: 使用 UUID时间戳 + 随机数 命名。
  • 需要去重的场景: 使用文件内容的哈希值命名。
  • 需要业务分类: 使用业务相关前缀 + UUID/时间戳 命名。

http://www.kler.cn/a/371764.html

相关文章:

  • Mount Image Pro,在取证安全的环境中挂载和访问镜像文件内容
  • 【Linux】文件切割排序 cut sort
  • IDEA解决 properties 文件乱码问题
  • 合并排序算法(C语言版)
  • MATLAB人脸考勤系统
  • stm32使用SIM900A模块实现MQTT对接远程服务器
  • Typora 、 Minio and PicGo 图床搭建
  • uniapp 图片bug(图片为线上地址,url不变,内容更新)
  • 红黑树模拟封装map和set
  • 关于我、重生到500年前凭借C语言改变世界科技vlog.12——深入理解指针(2)
  • 【热门主题】000013 C++游戏开发全攻略
  • 青少年编程与数学 02-002 Sql Server 数据库应用 20课题、连接与ORM
  • 基于springboot+vue实现的公司财务管理系统(源码+L文+ppt)4-102
  • QT访问数据库:应用提示Driver not loaded
  • 无人机螺旋桨动平衡分析测试台
  • 了解elasticsearch
  • YOLO11结合传统图像增强算法 | 让你的模型无惧黑暗 | 包含端到端推理代码 | 低照度图像增强
  • OpenCV视觉分析之目标跟踪(5)目标跟踪类TrackerMIL的使用
  • 《Windows PE》17.3 FSG壳
  • 怎么把word文档拆分成2个word文档,拆分后原格式保持不变
  • 机器学习结课项目报告
  • Es概念理解 ▎Es索引库操作 ▎Es文档操作
  • MySQL 9从入门到性能优化-创建触发器
  • 显示器时不时黑一下是什么原因?
  • DDoS攻击趋势令人担忧,安全防御体系构建指南
  • 自研小程序-心情追忆