V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jinker
V2EX  ›  问与答

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

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

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

    大概是用这个
    https://help.aliyun.com/document_detail/31852.html?spm=a2c4g.31848.0.0.1dd62cb7WkR9VT
    weijancc
        7
    weijancc  
       321 天前
    @jinker 个人是为了安全, 直接访问相当于暴露了你的文件存储服务器, 不过我这里指的是 minio 这种 s3 存储服务.
    jinker
        8
    jinker  
    OP
       321 天前
    @issakchill 我也是想到这种思路,但是实现本地存储不知道应该如何实现?是要将本地存储做的类似 minio 这些 oss 那样的方式吗?
    jinker
        9
    jinker  
    OP
       321 天前
    @issakchill 还有就是流量问题,oss 是如何套 cdn 的,这方面不了解。oss 的 cdn 不是应该和服务器的 cdn 同一个吗,我看资料貌似 oss 有自己的 cdn 。
    whileFalse
        10
    whileFalse  
       320 天前 via Android
    这个的难点在哪儿?
    你要是懒的写两套代码(尤其是前端)就让用户 post 图片到你的服务器你服务器再上传 s3 呗。
    chuck1in
        11
    chuck1in  
       320 天前 via iPhone
    现在论坛还可以备案吗?
    issakchill
        12
    issakchill  
       320 天前
    @jinker #8 本地上传我用最朴素的方式,就放在某个文件夹中,nginx 挂载上就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1546 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:48 · PVG 00:48 · LAX 09:48 · JFK 12:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.