应用后端涉及到普通文件存储的准备都通过 OSS/S3 的方式实现,内网环境用 MinIO,外网就用正常的 OSS 或者 S3.
问题在于:
1 上传的时候前端直接传还是通过后端中转? MinIO 的 Presigned 相关操作好像可以防止前端泄漏密钥之类。
2 无论前端还是后端跟 MinIO 交互,存储成功后好像没有返回文件地址,如何知道这个地址?
3 获取到文件访问地址后,直接存入数据库?那万一今后存储服务的 endpoint 变了怎么办?
1
Baymaxbowen 2020-08-06 14:52:33 +08:00 via iPhone
OSS 不是可以用 sts 的方式吗,前端获取签名
|
2
ooh 2020-08-06 14:56:55 +08:00
存进去文件名字是什么不就是什么吗,我只存了文件名,你这个 MinIO 太高级了吧...
|
3
wangxiaoaer OP @ooh #2 只把文件名存进去? 那完整的访问地址呢?
|
4
wunonglin 2020-08-06 15:06:51 +08:00
@wangxiaoaer #3 直传的话上传地址就是访问地址
|
5
ooh 2020-08-06 15:12:54 +08:00
@wangxiaoaer 打比方你有个 file 表,存了几个数据 guid name extension size 文件存到 bucket 的时候就指定 key 为 guid.extension,你访问的时候就是 https://endpoint/guid.extension 难道你需要存到不同的 bucket 里面?那就批量修改数据库呗
|
6
wangxiaoaer OP @ooh #5 嗯,我也考虑过一个应用都用固定的 bucket 。
假如 endpoint 为 http://192.168.1.100:9000,一个文件上传的时候 bucket=test filename=/a/b.png 那么只把 bucket 和 filename 存到数据库就足够了? 然后返回地址的时候应用层把 endpoint bucket filename 进行拼接返回? |
7
lshero 2020-08-06 15:24:10 +08:00
前一阵子发帖问了一下(/t/628055 )
最后感觉还是选择了后端生成 sts token 前端直传,毕竟节约后端的带宽,而且如果分片上传后端不用自己再重新实现一遍大文件分片上传的逻辑。 文件名称加上 endpoint 就是访问地址了,但是如果 bucket 是私有的话,后端分发地址之前之前需要自己生成签名或者前端使用 sdk 获取带签名的地址。 |
8
ooh 2020-08-06 15:32:14 +08:00 1
如果多个 bucket 你就加个字段标注一下,如果只有一个 bucket 你就存文件在 bucket 里面的文件名就是了,每个 bucket 都会分配一个子域名的,如果你直接用 s3 给你的子域名那就是 子域名+文件名 访问,如果你要用自己的子域名进行 cname 或者 反代 那就是 你自己的子域名+文件名访问,云存储浏览器端也可以直接上传文件到 bucket,你上传一个看看是什么样子的
|