使用 oss 的时候,应该保留后缀名吗?
使用 oss、gcs、minio、s3 等等对象存储的时候,应该保留后缀名吗?
比如我要做的是一个存储用户上传的图片、视频的服务,后缀可能是 jpg
、png
、mp4
等等。
因为要避免重复存储浪费存储空间的问题,所以我是这样打算的:
- 对用户上传的文件取
hashcode
(比如 md5 码),然后使用 hashcode 作为文件名保存在 oss 中 - 对于不同用户上传相同的视频、照片,就可以预先计算得到 hashcode,然后去 oss 去看下有没有指定的 key
- 有了,就不用重新上传到 oss
这样的设置解决了重复上传问题的同时,不需要引入一个 mysql
、redis
之类的东西记录重复
但是失去文件后缀不是一个好主意,有什么解决方案吗?
文件后缀,我应该通过文件的 content
去判断呢?还是通过用户带的文件后缀判断呢?
通过文件的 content
去判断,可以保证 100%
区分是什么文件吗?
通过用户带的文件后缀判断有感觉不是很靠谱,因为用户可以骗人!
然后就是后缀(或者说文件类型)应该加到文件路径(oss 称之为 key)中,还是作为 object 的 metadata
信息好呢?
回答:
除非你只存不取,否则一定有一个地方要记录 用户/文件原名/大小/hash后的文件名 等等信息的
有后缀名就用,用户自己不好好玩是用户的事情
回答:
还是推荐保留后缀名,我最近也有这方面的思考,考虑是否可以用一个长的hash不加后缀去存储对象,但我想到有些使用对象的终端可能不会分析文件内容(chrome很厉害,可以不加后缀,但不能保证其他应用或者平台可以做到这样),所以还是使用上传时候的后缀。
用户骗人,那是他的事,不需要你考虑,他自己骗自己和你没啥关系。
回答:
不建议用md5作为文件名,哈希值不适合用来做文件名,特别是md5,如果哈希冲突会造成文件被覆盖而丢失,建议使用用户名作为文件路径使用UUID作为文件名,保留后缀名。
秒传可以参考百度云盘秒传,使用 文件大小
、MD5
、前256KB数据的MD5
三个数据是否都相同判断是否为同一文件。
如果不引入数据库,判断文件是否存在有点麻烦,尝试这个取巧的办法:
设计一个占位文件,占位文件key
是文件大小
+MD5
+前256KB数据的MD5
- 上传前计算好
占位文件key
,然后判断占位文件是否存在 - 如果占位文件存在,则从占位文件的元数据中获取
真实文件key
并返回 - 如果占位文件不存在,则以UUID命名并上传文件,且在元数据中添加文件原名、
占位文件key
,上传成功后创建一个占位文件key
的空文件并带有真实文件key的元数据
以上是 使用 oss 的时候,应该保留后缀名吗? 的全部内容, 来源链接: utcz.com/p/938513.html