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

oss 做图片储存到底是在后端上传还是在前端上传好呢?

  •  
  •   leafiy · 2018-08-09 01:40:55 +08:00 · 6747 次点击
    这是一个创建于 2331 天前的主题,其中的信息可能已经有所发展或是发生改变。

    个人倾向于在后端做,毕竟 sdk 体积过大,但是又会增加至少 2 倍响应时间

    17 条回复    2018-08-09 14:48:42 +08:00
    34C
        1
    34C  
       2018-08-09 02:17:29 +08:00
    又拍云有 form api 直接在前端上传,和 sdk 没关系。
    搜了一下 OSS 的文档,也有直接前端上传的接口: https://help.aliyun.com/document_detail/31988.html
    sker101
        2
    sker101  
       2018-08-09 02:51:05 +08:00
    各有各的好处 看你们的业务和存储结构
    前端的好处不只是你说的一倍响应 还有大部分云存储提供的 SDK 都已经帮你把诸如上传百分比的东西写好了 前端直接用就好了 但是前端的话密钥之类的还是需要后端加密处理一下

    后端的话我觉得主要看你们有没有存储那些图片的需求 比如我公司是在上传之后把图片再存储到我们自己的表上 每个图片不只是有云存储那边的 key 还有自己的 ID 如果用前端的话需要预生成并且插入相应图片 ID 返回给前端再上传 不太好判断用户有没有上传成功 成功后也要再发送成功请求将图片的状态更新成成功

    但是后端也有问题比如如果不是你公司的服务器 是个人的 一般上传带宽都很小 那么用户上传因为对于服务器来说是下载速度很快 但是服务器要再传到云存储就很慢了 电脑端还好说 手机端选的图片通常都是原图 除非你后台服务器加工压缩一下 不然你要个 1M 的小水管那就等着一张图片上传个五六分钟吧 当然后台压缩也得花时间
    leafiy
        3
    leafiy  
    OP
       2018-08-09 03:48:50 +08:00
    @34C 今天刚刚更换成这个方案,缺点是还需要在后端根据 secret 生成 policy,一来一回至少 200ms,但是项目上传者都在海外,刚刚接到反馈还是比更换之前慢,所以在犹豫是不是有更好的方案。是个 toB 的项目,客户说话就要听啊没办法

    @sker101 状态和速度就是我纠结的地方,用了一周的后端上传客户表示纯上传速度满意,但倒霉的需求在前端不能用 objectUrl 所以响应时间比不用 oss 并没有提升。看了你的回复突发奇想是不是可以不直接上传到 oss,暂存在后端,定时任务根据上传表同步到 oss 后删掉,反正表记录的只是 ID,感觉很好操作的样子
    qiayue
        4
    qiayue  
       2018-08-09 06:28:13 +08:00
    提前生成,举个例子,发帖的场景,用户点进发帖页面,先当做所有人都会传图片,先把 policy 生成好放在那里,等到用户真正要上传的时候,就可以直接使用,如果用户不用,浪费了也就浪费了
    ywgx
        5
    ywgx  
       2018-08-09 07:56:33 +08:00 via Android
    前端发起上传走公网
    后端发起上传可以走内网
    play78
        6
    play78  
       2018-08-09 08:47:22 +08:00
    正好,我搭车问个问题哈。 就是 OSS 提供的无论是 SDK,还是 STS 的 Policy 直接上传到 OSS。
    如果直传到 OSS,我服务器能限制上传的总大小吗?
    现在我用 STS 生成一个密钥给客户端上传,目前只能限制前缀的部分信息。但是无法限制上传大小。客户可以任意上传,只要在有效期内,基本无限上传。
    各位在实际应用中有遇到吗?
    rogwan
        7
    rogwan  
       2018-08-09 08:54:19 +08:00 via Android
    前端上传,对用户上传内容的管理控制力弱,后端上传则控制力强很多。比如简单的图床类型,那就前端直接传简单;如果需要对图片类型大小进行处理编辑删除这些,那就后端处理,可以提高可靠性,不用等回调信息,回调也可能失败。
    rogwan
        8
    rogwan  
       2018-08-09 09:00:38 +08:00 via Android
    @play78 前端校验+后端根据回调再判断,大了就删掉。服务器没拿到回调数据没法提前知道文件大小吧,是否用有其他的方法?
    CrisTao
        9
    CrisTao  
       2018-08-09 10:57:58 +08:00
    @play78 #6 客户端限制大小不就行了
    leafiy
        10
    leafiy  
    OP
       2018-08-09 11:44:06 +08:00
    @play78 sdk 直传的话,肯定要在提交之前加一步验证吧。policy 的话,可以从前端获取文件信息传到后端,根据这个信息生成 policy,这时候就可以限制大小了啊
    leafiy
        11
    leafiy  
    OP
       2018-08-09 11:45:56 +08:00
    @play78 还有个方法,在 policy 里面用 content-length-range 限制
    34C
        12
    34C  
       2018-08-09 12:44:29 +08:00 via iPhone
    @leafiy 一来一回 200ms 也比用户传文件到你服务器上快啊,何况服务器带宽资源不要紧的啊?从服务器再传到 OSS 又占用一次带宽,大概是你业务量还没大到让你知道带宽有多重要。楼上也说了,加载页面的时候直接给 policy 省去你那 200ms
    also24
        13
    also24  
       2018-08-09 12:47:09 +08:00
    [项目上传者都在海外] 怎么感觉优化服务器位置或线路才是正途……
    leafiy
        14
    leafiy  
    OP
       2018-08-09 12:57:04 +08:00
    @34C 提前准备好 policy 这个没想到,应该是个好方法

    @also24 上传者在海外,但是使用者在大陆,流量太大,开海外优化费用出不起
    heww
        15
    heww  
       2018-08-09 13:30:10 +08:00
    @also24 #13 这个成本可能太大
    heww
        16
    heww  
       2018-08-09 13:35:33 +08:00
    @leafiy #3 类似“上传者在海外,但是使用者在大陆”的问题我前天刚刚提交过工单,一个成本不太大的方案是:
    1、国外用户上传到国外的 oss (选择一个对国外大部分地区都友好的 oss),国内的用户上传到国内 oss
    2、访问时直接放访问国内的 oss,记得前面加上 cdn
    3、如果文件在国内的 oss 中不存在(国外用户上传的),让国内的 oss 回源到国外的那个 oss
    leafiy
        17
    leafiy  
    OP
       2018-08-09 14:48:42 +08:00
    @heww 好主意啊,我搞了一天定时任务同步快吐了,一直没想到回源还能这么用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5772 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 03:00 · PVG 11:00 · LAX 19:00 · JFK 22:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.