后端开发上传图片到本地和云存储功能的思路是怎样的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jinker
V2EX    问与答

后端开发上传图片到本地和云存储功能的思路是怎样的?

  jinker 2023-06-11 15:58:40 +08:00 2005 次点击
这是一个创建于 919 天前的主题,其中的信息可能已经有所发展或是发生改变。
我自己开发的一个论坛程序,有个上传头像 rest api ,前端上传头像便是将通过这个 api 将文件上传到后端,后端再保存到本地目录下,数据库记录下路径,然后返回一个"key",前端将这个"key"更新到用户资料的"avatar_key"字段中。后续请求图片资源便是通过约定的 url 如 /resources/{key}来请求后端,后端根据 key 在数据库找到文件路径,将文件返回前端。

虽然搭建起来了,但我感觉有些不对劲,而且后续我上网找了很多资料,了解到了云存储。就希望后续可以提供有个配置选项,本地存储与云存储。但是要如何设计才能以最低代码支持两个方案?毕竟云存储的话我想要是使用预签名提供给前端,前端使用签名 url 上传到指定路径,但本地存储不是这样的方式,要想同时支持就要两套代码了啊?
12 条回复    2023-06-12 15:19:17 +08:00
weijancc
    1
weijancc  
   2023-06-11 16:05:43 +08:00
如果访问量不大, 就不要前端直接访问文件存储, 而是后端写一个接口, 收到文件的 key 时去获取文件存储的内容, 再返回给前端
jinker
    2
jinker  
OP
   2023-06-11 16:32:26 +08:00
@weijancc 能否告知为什么前端不要访问文件存储啊?后端获取文件存储内容再返回不是多一层消耗吗?
Bingchunmoli
    3
Bingchunmoli  
   2023-06-11 17:03:05 +08:00 via Android
因为你的 key ,一般都是直接存储路径没有 key 中间层,所以不论本地还是云端都支持
jinker
    4
jinker  
OP
   2023-06-11 17:09:12 +08:00
@Bingchunmoli 抱歉啊,有点不明白,一般都是直接存储路径没有 key 中间层是什么意思?
issakchill
    5
issakchill  
   2023-06-11 18:04:23 +08:00
写过类似的功能 返回给前端的都是整段地址的后半段,前半段通过不同实现去补全,可以做到本地跟 minio 切换
openliucongbx
    6
openliucongbx  
   2023-06-11 18:11:25 +08:00
我是获取 oss 的临时令牌,发给前端,前端直接上传到 oss,最后返回地址给我

大概是用这个
https://help.aliyun.com/document_detail/31852.html?spm=a2c4g.31848.0.0.1dd62cb7WkR9VT
weijancc
    7
weijancc  
   2023-06-11 18:17:08 +08:00
@jinker 个人是为了安全, 直接访问相当于暴露了你的文件存储服务器, 不过我这里指的是 minio 这种 s3 存储服务.
jinker
    8
jinker  
OP
   2023-06-11 18:53:06 +08:00
@issakchill 我也是想到这种思路,但是实现本地存储不知道应该如何实现?是要将本地存储做的类似 minio 这些 oss 那样的方式吗?
jinker
    9
jinker  
OP
   2023-06-11 18:59:55 +08:00
@issakchill 还有就是流量问题,oss 是如何套 cdn 的,这方面不了解。oss 的 cdn 不是应该和服务器的 cdn 同一个吗,我看资料貌似 oss 有自己的 cdn 。
whileFalse
    10
whileFalse  
   2023-06-12 06:36:23 +08:00 via Android
这个的难点在哪儿?
你要是懒的写两套代码(尤其是前端)就让用户 post 图片到你的服务器你服务器再上传 s3 呗。
chuck1in
    11
chuck1in  
   2023-06-12 07:36:32 +08:00 via iPhone
现在论坛还可以备案吗?
issakchill
    12
issakchill  
   2023-06-12 15:19:17 +08:00
@jinker #8 本地上传我用最朴素的方式,就放在某个文件夹中,nginx 挂载上就好了
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     905 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 31ms UTC 22:06 PVG 06:06 LAX 14:06 JFK 17:06
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86