使用 oss 的时候,应该保留后缀名吗?

使用 oss 的时候,应该保留后缀名吗?

使用 oss、gcs、minio、s3 等等对象存储的时候,应该保留后缀名吗?

比如我要做的是一个存储用户上传的图片、视频的服务,后缀可能是 jpgpngmp4 等等。

因为要避免重复存储浪费存储空间的问题,所以我是这样打算的:

  • 对用户上传的文件取 hashcode (比如 md5 码),然后使用 hashcode 作为文件名保存在 oss 中
  • 对于不同用户上传相同的视频、照片,就可以预先计算得到 hashcode,然后去 oss 去看下有没有指定的 key
  • 有了,就不用重新上传到 oss

这样的设置解决了重复上传问题的同时,不需要引入一个 mysqlredis 之类的东西记录重复

但是失去文件后缀不是一个好主意,有什么解决方案吗?

文件后缀,我应该通过文件的 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

回到顶部