文件存储目录设计 文件资源地址URI的设计

文件存储目录设计

  • 1. 前言
  • 2. 业界调研
    • 2.1 业界各大厂文件命名
      • 百度
      • 阿里-淘宝
      • 腾讯
      • 美团
      • 抖音
      • CSDN
    • 2.2 对象存储
      • 2.2.1 功能说明
      • 2.2.2 OSS命名建议
  • 3. 文件目录设计
  • 4. 其他建议

1. 前言

文件为什么要做目录管理?文件资源地址又该如何设计定义?

设计的由来都是基于特定需求,一般我们会对文件有什么需求呢?

  1. 区分文件上传来源/用途/场景;
  2. 文件命名的唯一性;
  3. 对文件进行处理,例如图像文件缩略图、视频抽封面等;
  4. 文件加密需求,例如用户聊天文件、账单等;
  5. 文件删除,例如删除特定场景下的文件、删除一年之前的文件;
  6. 文件迁移、备份;

本文不讨论文件存储系统本身的设计, 仅是从单纯的文件存储需求而言来设计文件存储目录及文件名。

2. 业界调研

2.1 业界各大厂文件命名

百度

  • 示例地址:

    • 头像: httpshttps://himg.bdimg.com/sys/portrait/item/public.1.4dc633e9.yzF6Dpkmm4OwSTNiS4Iz6A.jpg
    • 新闻文章中的图片:https://pics7.baidu.com/feed/962bd40735fae6cd7780e4d647231a2a43a70fea.jpeg@f_auto?token=94c67b39c02821fe985683e57b868f61
    • [百度图片]模块中的图片:https://t7.baidu.com/it/u=1785207335,3397162108&fm=193&f=GIF
    • 百度视频封面:https://f7.baidu.com/it/u=1718481929,608659536&fm=222&app=106&f=JPEG?x-bce-process=image/quality,q_80/resize,m_fill,w_660,h_370/format,f_auto
    • 百度视频:https://vdept3.bdstatic.com/mda-qeva57sjwpnzbd42/sc/h264/1717053003030242811/mda-qeva57sjwpnzbd42.mp4?v_from_s=hkapp-haokan-hbe&auth_key=1717093758-0-0-2f72b8b205d4c609a48d6e5044f7513c&bcevod_channel=searchbox_feed&cr=2&cd=0&pd=1&pt=3&logid=1758430182&vid=14518258860174020884&klogid=1758430182&abtest=101830_1-102148_1-17451_1
  • 分析:

    • 头像中有疑似有用户信息;
    • 新闻图片使用了guid;
    • 且还使用了token用于鉴权;
    • 百度视频封面x-bce-process用了定义的图片处理样式,视频地址增加了auth_key鉴权相关;
    • 视频地址中1717053003030242811是时间按信息;

阿里-淘宝

  • 示例地址:

    • 头像: https://wwc.alicdn.com/avatar/getAvatar.do?userNick=快乐悲魂&width=60&height=60&type=sns&_input_charset=UTF-8
    • 商品图片:https://gw.alicdn.com/imgextra/i2/2200632862640/O1CN011Tv5H61VNAWxjYAWQ_!!2200632862640.jpg_Q75.jpg_.webp
    • 商品详情:https://img.alicdn.com/imgextra/i4/2200632862640/O1CN01Ia8wGf1VNAZYZPAC1_!!2200632862640.jpg
    • 商品图片2: https://img.alicdn.com/imgextra/i3/299218127/O1CN01KmSEWV29uDerhttbW_!!299218127.jpg_80x80.jpg
  • 分析:

    • 头像地址携带了用户信息;
    • 商品图片疑似携带店铺信息和base64编码命名;

腾讯

  • 示例地址:

    • 图1:https://inews.gtimg.com/om_bt/Oj7iqkdFIvOFaugI6oIwpdPgxCQ7w7f4hmIcDGVJd85DcAA/641
    • 图2:https://inews.gtimg.com/news_ls/OtPMgQTuFo3LApiZ9FAfkiuSfpJTBi5_07NylI54flipQAA_870492/0
    • 游戏图片:https://gamer.qpic.cn/2024/05/23_fad7ede093ef5a6db810c72785ebc418.jpg?imageMogr2/crop/564x320/format/webp
  • 分析:

    • 区分了域名;
    • 区分了目录;
    • 游戏图片携带了日期+guid;
    • imageMogr2使用了自定义样式;

美团

  • 示例地址:

    • 图1:https://img.meituan.net/smartvenus/53b881ae4ff6ed7eb344d2479a611bff283561.jpg@1334w_60Q%7Cpr=1
    • 图2:https://img.meituan.net/smartvenus/a35d5aa65704808cfc6a614f21e918bd258524.jpg@620w_60Q%7Cpr=1.webp
    • 美团技术文章中图片:https://p1.meituan.net/travelcube/2d405d5c0aee2c1a3d0ac2a4caae2106427033.png
  • 分析:

    • 区分不同域名;
    • 使用guid命名;
    • 使用@符作为样式分割符来处理不同的样式文件;

抖音

  • 示例地址:

    • 图1:https://p3-pc-sign.douyinpic.com/tos-cn-p-0015/ocgDFBtyuAoDpd6WEBC8EfejN7V9mIAghA59gl~tplv-dy-resize-origshort-autoq-75:330.jpeg?biz_tag=pcweb_cover&from=3213915784&s=PackSourceEnum_DOUYIN_WEB_NEW_PAGE&sc=cover&se=false&x-expires=2032441200&x-signature=8vZhTHbvIyEu5WepMlIuuB4CjCU%3D
    • 图2:https://p3-pc-weboff.byteimg.com/tos-cn-i-9r5gewecjs/a795fb49bcbcf8cb1c762a69d57aee48.png
    • 视频地址:https://v3-webc.douyinvod.com/afeba8447b334b078ce777a5ce3d359f/6658bbe6/video/tos/cn/tos-cn-ve-15c001-alinc2/oMQfTMeB2CkjuA7qUTIABLIBlJGFupL00eYhYE/
  • 分析:

    • 区分不用域名;
    • 区分目录;
    • 使用了guid;

CSDN

  • 示例地址:

    • 头像地址:https://profile-avatar.csdnimg.cn/43dddb50b85448eeb2a4089eb2210d0a_kuailebeihun.jpg
    • 不模块的博文文章中图片的地址
      • https://img-blog.csdnimg.cn/direct/0357972c4ea7489a80e5032732424ab4.png
      • https://img-community.csdnimg.cn/images/21894b3380844b22a4755cde7fe98b59.png
    • 图片带水印地址:https://img-blog.csdnimg.cn/20190929112628623.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pob3V5b25nZ28=,size_16,color_FFFFFF,t_70
  • 分析:

    • 不同场景或许使用了不同的bucket
    • 有区分使用不同目录;
    • 文件都使用uuid命名;
    • x-oss-process很容易看出来用的是阿里的对象存储;

2.2 对象存储

一般来说,现在厂商提供的对象存储服务远比自己搭建的文件系统要稳定、成本更低。了解对象存储的功能、哪怕就算自建文件系统,有利于了解对象存储的需求,和应对文件目录名称的命名。

在对象存储中,目录名称+文件名称,整体都作定义为对象的文件名;目录层级也是文件名的一部分。

2.2.1 功能说明

阿里OSS、七牛kodo、腾讯cos、火山tos等各大厂商的对象存储功能类似;

本文以OSS为例说明,列举几个和文件地址命名相关的几点功能:

  • bucket区分私有公有
  • 图片处理可以通过参数自定义样式;
  • 可以按照分隔符自定义样式,样式图片可以通过图片访问链接 + 分隔符 + 样式名称进行访问;
  • 生命周期(低频/归档/删除)、跨区域复制、导出文件清单列表、镜像回源 可以按照文件名前缀设定配置;
  • 镜像回源还可以处理文件名后缀设置;

2.2.2 OSS命名建议

以下3点是官网文档原话:

  1. 使用有意义的名称。Object的名称应该反映对象的内容和用途,方便查找和理解。例如,使用文件名、日期、用户ID等信息作为Object的名称。
  2. 使用唯一的名称。Object的名称应该是全局唯一的,以避免命名冲突。可以在Object的名称中包含一些随机数或UUID等信息,确保名称的唯一性。
  3. 使用前缀来组织数据。前缀是Object的名称的一部分,可以用于为Object创建层次结构。例如,按日期、用户ID、地域等信息作为前缀,可以更好地组织和管理数据。

其中,在文件名中使用用户ID等私密信息数据,个人不太建议;特别是地址中仅有这类信息时,容易造成数据泄露。
就算真的使用,也建议使用加密算法、最次base64一下。

3. 文件目录设计

${catalog}/${day}/${guid:0:4}/${guid}${flag}.${fileType}

  • catalog 目录,数字和小写字母组成;可以根据自己需要限制一下长度
    • 用于区分场景、上传来源
    • 也可以区分私有、公有(三方对象存储可以新建不同bucket)
    • 使用场景:原始文件可以衍生更多的文件可以使用flag标识,例如MP4视频可以处理成h265/h264/flv等格式,可以使用不同的目录
  • day 日期,例如:20240531
    • 可以根据文件地址中的日期,快速查找文件上传、处理的日志文件
    • 可以按照一定前缀处理文件,例如按照时间前缀导出文件清单
    • 文件本地落盘方便处理
  • guid 全局唯一标识符,完整是36位
    • 取前4位作为三级目录,本地落盘文件会分散各个文件夹;(这个在uri上非必要,可以在落盘时逻辑上新建出这个目录)
    • guid作为文件名的一部分
    • 用于作为文件的唯一标识
  • flag 特征符,非必须,统一使用_作为flag的前缀
    • 一些特殊定义的信息,例如用户ID、版本、用途标识等
  • fileType 点后面跟文件的后缀类型,例如:jpg/JPEG/mp4/tar.gz

需满足正则^[a-z0-9]{2,16}\/[0-9]{8}\/[a-z0-9]{4}\/[a-z0-9-]{36}(_\w+)?\.[.\w]+$

以Python为例,代码生成对象名称uri:

import uuid
import datetimecatalog = "test"
guid = str(uuid.uuid4())
day = datetime.datetime.now().strftime("%Y%m%d")
flag = "_ori"
fileType = "jpg"uri = f"{catalog}/{day}/{guid[:4]}/{guid}{flag}.{fileType}"
print(uri)
# test/20240531/bedc/bedcb587-0334-47ba-8af5-4a40e49c9f27_ori.jpg

4. 其他建议

  • 文件命名规则不要交由client端,容易被攻击;
    • 对外的接口只传递文件内容和场景即可,文件地址由后端生成;
  • 若是使用三方对象存储例如OSS,建议屏蔽样式自定义参数,采用后台配置样式的方式;
  • 不太建议将用户信息放在文件名称上,容易造成数据泄露;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 离线安装 gcc、g++、make 等依赖包

前言 项目现场的服务器无法连接互联网,需要提前获取 gcc、g、make 等依赖包。 一、如何获取依赖包 需要准备一台可以连接互联网的电脑(如:个人电脑上的虚拟机安装一个与服务器一样的系统),用于下载依赖包。之后把通过…

Python Arr用法:深度解析与实战应用

Python Arr用法:深度解析与实战应用 在Python编程中,数组(通常称为列表或list)是一种常用的数据结构,用于存储和操作一系列有序的元素。然而,Python的标准库并未直接提供类似C语言中的数组类型&#xff0c…

【Linux】Linux工具——yum,vim

1.Linux 软件包管理器——yum Linux安装软件: 源代码安装(不建议)rpm安装(类似Linux安装包,版本可能不兼容,不推荐,容易报错)yum安装(解决了安装源,安装版本&…

四川音盛佳云电子商务有限公司引领抖音电商新风潮

在数字化浪潮席卷全球的今天,电商行业已成为推动经济发展的重要力量。作为这一领域的佼佼者,四川音盛佳云电子商务有限公司凭借其在抖音电商服务领域的专业实力和独特视角,正引领着行业的新风潮,助力品牌实现快速增长和腾飞。 四…

使用Python发送企业微信消息

大家好,在本文中,我们将探讨如何使用 Python 发送企业微信消息。将详细说明如何通过 Python 脚本实现消息的发送。无论是希望自动化某些任务,还是想要快速地向团队发送实时通知,本文都将为您提供一站式的解决方案。 企业微信提供了…

找不到msvcr100.dll如何修复,分享几种有效的修复方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“找不到msvcr100.dll”。这个错误通常发生在运行某些程序时,系统无法找到所需的动态链接库文件。这个问题可能会给用户带来困扰,但是幸运的是,有一些简单…

面试网易大模型算法岗,题是一道比一道难啊。。。

暑期实习基本结束了,校招即将开启。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。提前准备才是完全之策。 最近,我们又陆续整理了很多大厂的面试题&#xff0c…

汇编原理 | 二进制、跳转指令、算数运算、

一.二进制 two complement reprentation(补码) 二进制的运算: 6的二进制 0110 -6的二进制 如何表示? 四个bit的第一个bit表示符号:1负0正 -6表示为1010 解释: 0 0000 1 0001 -1 1111(由 …

49、Floyd求最短路

Floyd求最短路 题目描述 给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。 再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输出“imposs…

RestTemplate中multipart form data传多个参数的处理办法

应用场景 前端请求后端上传单个或多个文件,同时携带其他参数,后端再转发到第三方服务。 思路 拿到前端提交的multipart参数读取参数并区分文件/其他参数请求第三方 实现 拿到前端提交的参数并解析到MultiValueMap: private static Mult…

【Ubuntu】100 系统字体安装和更改

系统:Ubuntu18.04LTS 1 Why we need? 写这篇经验贴的原因: ①我需要装一下中文字体(Qt要用); ②想调一下字体大小和默认中文字体的样式 2 装第三方字体 Step1:安装软件Font Manager sudo ap…

【记录】打印|用浏览器生成证件照打印PDF,打印在任意尺寸的纸上(简单无损!)

以前我打印证件照的时候,我总是在网上找在线证件照转换或者别的什么。但是我今天突然就琢磨了一下,用 PDF 打印应该也可以直接打印出来,然后就琢磨出来了,这么一条路大家可以参考一下。我觉得比在线转换成一张 a4 纸要方便的多&am…

Echarts 让柱状图在图表中展示,离开X轴

文章目录 需求分析需求 分析 话不多说,直接源码展示 option = {title: {text: Waterfall Chart,subtext: Li

落地台灯有什么作用?五款口碑好的落地台灯推荐

落地台灯有什么作用?面对长时间工作、学习已成为当代年轻人的真实写照,据目前不完全统计,60%以上的人群每天用眼时间都已经超过10小时,高强度的的用眼以及不可确定的环境因素都易导致双眼出现干涉、酸痛、红血丝等情况&#xff0c…

请简述Vue更新数组时触发视图更新的方法?

在Vue中,当你直接修改数组(如使用索引直接设置一个项或者使用length属性修改数组长度)时,Vue不能检测到这些变化,因此不会触发视图的更新。为了解决这个问题,Vue提供了一些方法来修改数组以触发视图的更新。…

[有监督学习]6.详细图解朴素贝叶斯

朴素贝叶斯 朴素贝叶斯(Naive Bayes)是常用于自然语言分类问题的算法。它在垃圾邮件过滤上的应用非常有名。 概述 朴素贝叶斯是一个基于概率进行预测的算法,在实践中被用于分类问题。具体来说,就是计算数据为某个标签的概率&…

从零开始利用MATLAB进行FPGA设计(七)用ADC采集信号教程2

黑金的教程做的实在太拉闸了,于是自己摸索信号采集模块的使用方法。 ADC模块:AN9238 FPGA开发板:AX7020;Xilinx 公司的 Zynq7000 系列的芯片XC7Z020-2CLG400I,400引脚 FBGA 封装。 往期回顾: 从零开始利…

STM32学习问题总结(2)—CubeMX生成项目后串口没效果和Microlib

检查完所有的硬件和软件部分,最后发现,又是Keil的设置问题,啊啊啊啊 打开Keil的魔术棒,勾选Target的Use Microlib选项即可,但这并不是最佳方案 最终解决方案: 参考:http://t.csdnimg.cn/2Tjfc…

PLC坐标系统怎么编程:深入解析与实战应用

PLC坐标系统怎么编程:深入解析与实战应用 在工业自动化领域,可编程逻辑控制器(PLC)扮演着至关重要的角色。而PLC坐标系统作为其核心组成部分,对于实现精确控制和高效运行具有至关重要的作用。本文将从四个方面、五个方…

代码随想录算法训练营第四十六天| 完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ

完全背包 题目链接:完全背包 文档讲解:代码随想录/完全背包 视频讲解:视频讲解-完全背包 状态:已完成(1遍) 解题过程 这几天属实是有点分身乏术了,先直接看题解AC了,二刷的时候再…