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

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

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

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

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/时间戳 命名。

相关文章:

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

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

哈希表 算法专题

哈希表简介 是什么 存储数据的容器有啥用? "快速"查找某个元素什么时候用哈希表 频繁地查找某个数(有序用二分)怎么用哈希表 容器用数组模拟 字符串中的字符 范围比较小的数 一. 两数之和 两数之和 class Solution {public int[] twoSum(int[] nums, int targe…...

unity3d————[HideInInspector]

在Unity3D中,[HideInInspector]是一个属性修饰符,它的主要作用是在Unity的Inspector窗口中隐藏变量或属性。以下是关于[HideInInspector]的详细解释和作用: 作用 隐藏变量或属性:当你在脚本中使用[HideInInspector]修饰符时&…...

Soanrquber集成Gitlab 之 导入Gitlab项目

集成Gitlab 之 导入Gitlab项目 说明: Sonarquber里面的项目,顺便设置,只要在集成CI的时候,使用这个项目的项目标识即可。 当然项目名称一一对应是最好的了,所以这里讲导入Gitlab的项目,项目名称一一对应&…...

论区块链技术及应用

引言 区块链技术作为一种革命性的创新,近年来在全球范围内得到了广泛关注和应用。其去中心化、透明性和不可篡改的特性,使其在多个领域展现出了巨大的潜力。从金融到物联网,从医疗管理到政务监管,区块链正在改变我们处理信息和进…...

GPT避坑指南:如何辨别逆向、AZ、OpenAI官转

市面上有些说自己是官转,一刀只需要1块甚至几毛钱,并声称官方倍率的,很大可能就是使用的是 逆向或Azure。 如何鉴别逆向 逆向的种类很多,主要分为3类 逆向不知名A| 镜像站或偷的 key。成本约等于0,调用聊天数据可能在…...

Qt 文本文件读写与保存

Qt 文本文件读写与保存 开发工具&#xff1a;VS2013 QT5.8 设计UI界面&#xff0c;如下图所示 sample7_1QFile.h 头文件&#xff1a; #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample7_1QFile.h"class sample7_1QFile : public QMainWin…...

Linux基础环境搭建(CentOS7)- 安装Scala和Spark

#Linux基础环境搭建&#xff08;CentOS7&#xff09;- 安装Scala和Spark Linux基础环境搭建&#xff08;CentOS7&#xff09;- 安装Scala和Spark 大家注意以下的环境搭建版本号&#xff0c;如果版本不匹配有可能出现问题&#xff01;&#xff08;spark不要下2.4版本的 会报错…...

SpringBoot 下的Excel文件损坏与内容乱码问题

序言 随着打包部署的方式的改变&#xff0c;原本正常运行的代码可能带来一些新的问题&#xff0c;比如我们现在使用SpringBoot 的方式生成Jar包直接运行&#xff0c;就会对我们再在Resource下的Excel文件产生影响&#xff0c;导入与预期不符的情况发生cuiyaonan2000163.com 比…...

官宣下代GPU存在缺陷,50系显卡或将迎来涨价

如果说 AMD 在 Ryzen 3000 系列还是和 intel 在 CPU 方面棋差一着的话&#xff0c;Ryzen 5000 系列就是打了个漂亮的翻身仗了。 凭借先进的 7nm 工艺制程和全新架构&#xff0c;让后来 intel 急忙推出「14nm」的 11 代酷睿也难以望其项背。 直到 intel 12 代发布的时候&#xf…...

使用pytorch实现LSTM预测交通流

原始数据&#xff1a; 免费可下载原始参考数据 预测结果图&#xff1a; 根据测试数据test_data的真实值real_flow&#xff0c;与模型根据测试数据得到的输出结果pre_flow 完整源码&#xff1a; #!/usr/bin/env python # _*_ coding: utf-8 _*_import pandas as pd import nu…...

C/C++(八)C++11

目录 一、C11的简介 二、万能引用与完美转发 1、万能引用&#xff1a;模板中的 && 引用 2、完美转发&#xff1a;保持万能引用左右值属性的解决方案 三、可变参数模板 1、可变参数模板的基本使用 2、push 系列和 emplace 系列的区别 四、lambda表达式&#xf…...

使用three.js 实现 自定义绘制平面的效果

使用three.js 实现 自定义绘制平面的效果 预览 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.jsconst box document.getElementById(box)const scene new THREE.Scene()const camera new THREE.PerspectiveCam…...

玩转Docker | 使用Docker部署捕鱼网页小游戏

玩转Docker | 使用Docker部署捕鱼网页小游戏 一、项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署捕鱼网页小游戏下载镜像创建容器检查容器状态下载项目内容查看服务监听端口安全设置四、访问捕鱼网页小游戏五、总结一、项目介绍…...

第2章 Android App开发基础

第 2 章 Android App开发基础 bilibili学习地址 github代码地址 本章介绍基于Android系统的App开发常识&#xff0c;包括以下几个方面&#xff1a;App开发与其他软件开发有什么不一 样&#xff0c;App工程是怎样的组织结构又是怎样配置的&#xff0c;App开发的前后端分离设计…...

通过 SYSENTER/SYSEXIT指令来学习系统调用

SYSENTER指令—快速系统调用 指令格式没有什么重要的内容,只有opcode ,没有后面的其他字段 指令的作用: 执行快速调用到特权级别0的系统过程或例程。SYSENTER是SYSEXIT的配套指令。该指令经过优化&#xff0c;能够为从运行在特权级别3的用户代码到特权级别0的操作系统或执行过程…...

Nginx开发实战——网络通信(一)

文章目录 Nginx开发框架信号处理函数的进一步完善(避免僵尸子进程)(续&#xff09;ngx_signal.cxxngx_process_cycle.cxx 网络通信实战客户端和服务端1. 解析一个浏览器访问网页的过程2.客户端服务器角色规律总结 网络模型OSI 7层网络模型TCP/IP 4层模型3.TCP/IP的解释和比喻 最…...

w外链如何跳转微信小程序

要创建外链跳转微信小程序&#xff0c;主要有以下几种方法&#xff1a; 使用第三方工具生成跳转链接&#xff1a; 注册并登录第三方外链平台&#xff1a;例如 “W外链” 等工具。前往该平台的官方网站&#xff0c;使用手机号、邮箱等方式进行注册并登录账号。选择创建小程序外…...

获取平台Redis各项性能指标

业务场景 在XXXX项目中把A网的过车数据传到B网中&#xff0c;其中做了一个业务处理&#xff0c;就是如果因为网络或者其他原因导致把数据传到B网失败&#xff0c;就会把数据暂时先存到redis里&#xff0c;并且执行定时任务重新发送失败的。 问题 不过现场的情况比较不稳定。出…...

STM32 HAL 点灯

首先从点灯开始 完整函数如下&#xff1a; #include "led.h" #include "sys.h"//包含了stm32f1xx.h&#xff08;包含各种寄存器定义、中断向量定义、常量定义等&#xff09;//初始化GPIO口 void led_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开…...

告别Python依赖!手把手教你用C++复现Librosa的Mel频谱和MFCC特征提取

高性能C音频特征提取实战&#xff1a;从Librosa原理到嵌入式部署优化 在语音识别和音频分析领域&#xff0c;Mel频谱和MFCC特征提取是基础但关键的技术环节。许多开发者习惯使用Python的Librosa库快速实现原型&#xff0c;但当需要部署到生产环境时&#xff0c;Python的解释器性…...

告别Demo!用EMQX和Java模拟真实物联网设备上报数据流(Windows本地开发环境)

告别Demo&#xff01;用EMQX和Java构建真实物联网数据流模拟方案 在物联网开发中&#xff0c;最令人头疼的莫过于缺乏真实设备进行测试。想象一下&#xff0c;当你精心设计的平台等待设备接入时&#xff0c;硬件团队却告诉你"下周才能交付原型机"。这种等待不仅拖延进…...

轻量级配置管理框架zcf:多环境配置、敏感信息加密与云原生集成实践

1. 项目概述&#xff1a;一个面向开发者的轻量级配置管理框架最近在梳理团队内部工具链时&#xff0c;发现一个挺普遍的问题&#xff1a;不同项目、不同环境&#xff08;开发、测试、生产&#xff09;的配置管理总是乱糟糟的。.env文件满天飞&#xff0c;敏感信息一不小心就提交…...

基于Circuit Playground Express与NeoPixel的四季交互灯光装置设计与实现

1. 项目概述与核心思路几年前&#xff0c;我在一个艺术展上看到一组悬挂在枯树枝上的玻璃瓶&#xff0c;里面装着会呼吸般变幻光线的LED灯&#xff0c;那种静谧又灵动的美感让我念念不忘。作为一个喜欢把代码和电路“藏”进生活场景里的硬件爱好者&#xff0c;我一直在琢磨如何…...

Noto Emoji:专业解决跨平台表情符号渲染难题的终极方案

Noto Emoji&#xff1a;专业解决跨平台表情符号渲染难题的终极方案 【免费下载链接】noto-emoji Noto Emoji fonts 项目地址: https://gitcode.com/gh_mirrors/no/noto-emoji 在现代数字通信中&#xff0c;表情符号已成为不可或缺的语言元素&#xff0c;然而跨平台表情符…...

MPLAB代码配置器实战:图形化配置PIC/AVR单片机外设,提升开发效率

1. 项目概述&#xff1a;为什么你需要关注MPLAB代码配置器如果你正在使用Microchip的PIC或AVR单片机&#xff0c;并且还在手动编写外设初始化代码、一遍遍翻阅数据手册核对寄存器位&#xff0c;那今天聊的这个工具&#xff0c;可能会让你有种“相见恨晚”的感觉。我说的就是MPL…...

Adafruit Feather RP2040 SCORPIO:专为大规模NeoPixel灯光控制而生的开发板

1. 项目概述&#xff1a;为什么你需要一块专为大规模灯光控制而生的开发板&#xff1f;如果你曾经尝试过用一块普通的微控制器驱动超过几百个NeoPixel&#xff08;或WS2812&#xff09;LED&#xff0c;你很可能已经撞上了性能的天花板。CPU被时序生成任务完全占用&#xff0c;动…...

一个产业带还值不值得押注?用 4 个生命周期阶段,对照 4 类可观察指标自己判断

你是卖设备、卖材料、卖工业服务的上游销售员。摆在你面前的是一张产业带地图&#xff1a;古镇灯饰、晋江运动鞋、戴南不锈钢、盛泽化纤、安平丝网……每一个都聚着成千上万家工厂。 问题来了&#xff1a;要在哪个产业带投入你的差旅、样品、地推团队&#xff1f;押错地方&…...

Linux系统下Vue开发环境搭建:从Node.js到Vite的完整指南

1. 项目概述&#xff1a;为什么要在Linux上搭建Vue环境&#xff1f;对于前端开发者而言&#xff0c;Vue.js 早已不是陌生的名字。它凭借其渐进式的设计理念、灵活的组件化系统和相对平缓的学习曲线&#xff0c;成为了构建现代Web应用的主流框架之一。然而&#xff0c;很多开发者…...

暗黑破坏神II终极角色编辑器:Diablo Edit2完全使用指南

暗黑破坏神II终极角色编辑器&#xff1a;Diablo Edit2完全使用指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit Diablo Edit2是暗黑破坏神II玩家必备的角色存档编辑器&#xff0c;这款开源工具…...