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

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

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

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

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

示例:

java 复制代码
String fileName = UUID.randomUUID().toString() + "." + fileExtension;

优点:

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

缺点:

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

2. 时间戳 + 随机数

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

示例:

java 复制代码
String fileName = System.currentTimeMillis() + "_" + new Random().nextInt(1000) + "." + fileExtension;

优点:

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

缺点:

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

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

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

示例:

java 复制代码
String fileName = "user_" + userId + "_" + System.currentTimeMillis() + "." + fileExtension;

优点:

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

缺点:

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

4. 哈希文件名

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

示例:

java 复制代码
String fileName = DigestUtils.md5DigestAsHex(fileContent) + "." + fileExtension;

优点:

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

缺点:

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

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

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

示例:

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

优点:

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

缺点:

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

总结建议

  • 常规文件存储: 使用 UUID时间戳 + 随机数 命名。
  • 需要去重的场景: 使用文件内容的哈希值命名。
  • 需要业务分类: 使用业务相关前缀 + UUID/时间戳 命名。
相关推荐
开心猴爷7 分钟前
APP 上架苹果 App Store 被拒,并不总是产品问题
后端
deng-c-f12 分钟前
Linux C/C++ 学习日记(59):手写死锁监测的组件
学习
深蓝海拓16 分钟前
PySide6从0开始学习的笔记(十三) IDE的选择
笔记·python·qt·学习·pyqt
Li_76953217 分钟前
Redis —— (五)
java·redis·后端·spring
崇山峻岭之间25 分钟前
Matlab学习记录05
开发语言·学习·matlab
用户479492835691525 分钟前
你每天都在用的 JSON.stringify ,V8 给它开了“加速通道”
前端·chrome·后端
nnsix29 分钟前
Unity 新InputSystem 学习笔记
笔记·学习
JIngJaneIL31 分钟前
基于java+ vue办公管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
uzong36 分钟前
如何将项目做出 owner 的感觉
后端
roman_日积跬步-终至千里38 分钟前
【人工智能导论】05-学习-机器学习基础:从数据到智能决策
人工智能·学习·机器学习