哪种好?

xxx.jpg
/assets/xxx.jpg

谢谢大家的指导,我想了以下还是采用了第一种,只保存文件名。前端请求头像链接时,利用 Laravel ORM 的重写功能为文件名加上目录前缀( xxx.jpg -> /assets/xxx.jpg ),项目在当初设计时要求文件都存在后端服务器上,所以选择这样子。

1

尽少我选择 xxx

文件名以用户相关唯一信息储存,数据库就不用存了,缺点是不会有记录。

都行,反正不要存文件就行

1 挺好的, 在代码里拼接路径可以灵活一些。万一哪天路径要改成 assets/xx/xxx.jpg, assets/yy/yyx.jpg 呢?(这种情况,比如 assets/xx/ 放在了 A 硬盘,assets/yy/ 放在了 B 硬盘

2因为 1 扩展起来挺麻烦的,如果确认只有几万个头像那倒是无所谓

存完整 URL ,不差这点存储空间。只存相对路径,一旦需要支持多 URL 基地址(多个 OSS )就 gg 了,具体可以参考 Casdoor: github.com/casdoor/casdoor

存完整的 URL 。1 限制了前缀只能有一个。

看标题我还以为你说的完整 url 是 example.com/assets/xxx.jpg 这样呢

这问题很蛋疼,即使你选了 1 ,以后想改 2 ,只要在 2 变更 path 前,sql 一下批量更新一下就行了。又或者在增加一个字段存放 path 都可以。犯得着这么纠结么,还是不自信?

你这其实都是相对路径,感觉没太大区别🐶,用 2 可能维护容易点,一看就知道在哪里了

直接 base64 存数据库,最讨厌大量零碎的小文件

这俩没区别吧,2 如果有变动也就是再加一层文件夹的事,既然没区别那就选占用少的

为啥不用 OSS 存储图片

存文件 id 。

基本成熟点的系统都会直接存 oss 的绝对地址吧

只要不把二进制直接存进去就都 OK

1 吧,路径写在配置文件里面

我选第二种,因为我懒。我不想代码在组装一次。

第一种,只需要保存文件名,文件 URL 可以通过代码拼接将来如果要移动到其他目录,代码里修改一下拼接就好了。如果用第二种,将来修改路径会很麻烦

肯定 1 咯,楼上说的多个 OSS 的情况再新增一个 bucket 字段呗,国内这种网络环境,无论是批量更换 CDN 地址或者域名被封都能很快解决

找找 uid+头像上传时间 生成短链的

存完整的 URL

#12 +1

我觉得还是对象存储吧,存 1

肯定第一种好,数据冗余低,信息密度高,迁移也方便

我的做法是写两个字段,filename 和 storage_provider ,这样的做法的好处是只存我文件名就行,并且如果后续需要新的基础路径或者存到 OSS/S3 上,那开个新的 storage_provider id 就行了

存路径,毕竟很有可能将来改成对接对象存储来存储头像,到时候的路径就要改成个网址了

选 1,选 2 这不是我正经历的么? 老系统:直接 uid.jpg 图片路径都不需要存 如果要调图片(直接饮用传参过来的 id 直接可以得到路径,少查一次数据库,又节省 了数据库的空间 新系统:有存路径,( oss 的路径,优点:不需要拼装直接从数据库读取地址(也就是上面的 缺点 我以为第一种更优秀 但是团队协作需要包容更多

2 扩展起来不更麻烦 你以后如果要把图片都上到云还都得改 而 1 只需要重写个类改下返回值就能直接用

为啥要把数据膨胀三分之一存进去呢?

MySQL 存 id 号。OSS 存内容。用的时候作下关联。

文件放 oss 省心

这个应该是结合自己的业务需求,如果量级小,那全路径也无所谓。但如果业务量大,多一个字符都是浪费。所以连后缀都可以由代码生成。

不是把字符串 base64 ,是把图像文件二进制 base64 存进去

对啊,你为啥要把图像额外 base64 一步?数据库 blob 字段直接用不就得了?

存储的本质就是选择用什么数据结构当容器存数据罢了,1 就是当作集合,2 就是当作树。实际上不分路径按一定的规范取文件名、给文件分类到不同文件夹、给文件加标签,这些都是当作树存储。选择外部存储也无非是把树结构的信息存到外部罢了。想清楚树结构的信息放到哪最能接受就可以。

头像不是和 id 或者其他字段关联的吗?不用额外记

头像上传之后按用户 id 编制文件名保存到对象存储。

这取决于图片是怎样被读取的吧?如果图片路径是前端上写死的,那只存名字可以啊。如果图片路径是后端下发的,那存完整 URL 或者相对路径都可以。

二选一的话,选 1 。概念上区分 “存” 的“原始数据”是文件名而不是 URL ,而“取”(对象方法/属性)的是 URL ,会更好一点。

存 1 ,占用存储的空间少。

我们后端选择 2 的做法

给自己找事做是吧

看错了,我以为你是运维😂

Web 上一般会有独立的 CDN 域名,这样可以减少请求时携带 Cookies 这些在 CDN 场合没用的东西再就是把头像 URL 分成 a)通用的 prefix 部分 & b)不能通用的文件名部份prefix 当作程序的常量写在 config 里,文件名部份存数据库里

1

列 avatar_url (存 xxx.jps ), 列 store_type (如果有不同储存桶)

#32 难道图片 base64 就不膨胀了吗

为啥大家和我的都不一样,linux 和 oss 不是有最大文件数限制的么,虽然很大,但不怕这个值直接爆了么,所以很大一部分图片、文件,我都是按日期分文件夹存的,存 2

并不耽误分子目录

好不好,看你的痛点在哪。OP 说的这两种,我都不喜欢,我更喜欢直接把图片字节数据存入数据库。直接存数据库更灵活,一切都可以动态计算或缓存,也方便防篡改、备份和同步。存文件理论上可以减少数据库 IO ,但如果你有 CDN 缓存之类的手段,一样可以实现目的。

username 就是头像文件名

如果图片太大 存数据库不会影响速度吗

从我见过的这么多网站中,80%-90%都是 2 的做法。