OSS/S3 的最佳实践

2020-08-06 14:43:45 +08:00
 wangxiaoaer

应用后端涉及到普通文件存储的准备都通过 OSS/S3 的方式实现,内网环境用 MinIO,外网就用正常的 OSS 或者 S3.

问题在于:

1 上传的时候前端直接传还是通过后端中转? MinIO 的 Presigned 相关操作好像可以防止前端泄漏密钥之类。

2 无论前端还是后端跟 MinIO 交互,存储成功后好像没有返回文件地址,如何知道这个地址?

3 获取到文件访问地址后,直接存入数据库?那万一今后存储服务的 endpoint 变了怎么办?

1437 次点击
所在节点    问与答
8 条回复
Baymaxbowen
2020-08-06 14:52:33 +08:00
OSS 不是可以用 sts 的方式吗,前端获取签名
ooh
2020-08-06 14:56:55 +08:00
存进去文件名字是什么不就是什么吗,我只存了文件名,你这个 MinIO 太高级了吧...
wangxiaoaer
2020-08-06 15:02:00 +08:00
@ooh #2 只把文件名存进去? 那完整的访问地址呢?
wunonglin
2020-08-06 15:06:51 +08:00
@wangxiaoaer #3 直传的话上传地址就是访问地址
ooh
2020-08-06 15:12:54 +08:00
@wangxiaoaer 打比方你有个 file 表,存了几个数据 guid name extension size 文件存到 bucket 的时候就指定 key 为 guid.extension,你访问的时候就是 https://endpoint/guid.extension 难道你需要存到不同的 bucket 里面?那就批量修改数据库呗
wangxiaoaer
2020-08-06 15:17:40 +08:00
@ooh #5 嗯,我也考虑过一个应用都用固定的 bucket 。

假如 endpoint 为 http://192.168.1.100:9000,一个文件上传的时候 bucket=test filename=/a/b.png

那么只把 bucket 和 filename 存到数据库就足够了? 然后返回地址的时候应用层把 endpoint bucket filename 进行拼接返回?
lshero
2020-08-06 15:24:10 +08:00
前一阵子发帖问了一下(/t/628055 )
最后感觉还是选择了后端生成 sts token 前端直传,毕竟节约后端的带宽,而且如果分片上传后端不用自己再重新实现一遍大文件分片上传的逻辑。
文件名称加上 endpoint 就是访问地址了,但是如果 bucket 是私有的话,后端分发地址之前之前需要自己生成签名或者前端使用 sdk 获取带签名的地址。
ooh
2020-08-06 15:32:14 +08:00
如果多个 bucket 你就加个字段标注一下,如果只有一个 bucket 你就存文件在 bucket 里面的文件名就是了,每个 bucket 都会分配一个子域名的,如果你直接用 s3 给你的子域名那就是 子域名+文件名 访问,如果你要用自己的子域名进行 cname 或者 反代 那就是 你自己的子域名+文件名访问,云存储浏览器端也可以直接上传文件到 bucket,你上传一个看看是什么样子的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/696161

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX