V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vinceeema
V2EX  ›  Node.js

上传文件到 S3 内存管理

  •  
  •   vinceeema · 2017-05-28 13:11:19 +08:00 · 2798 次点击
    这是一个创建于 2735 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前结构是前端把文件上传至 node 后端,然后后端上传到 S3. 目前前端后端都做了 validation. 但是如果直接通过 api endpoint 上传,后端会把所有东西先 load 到内存后才能做 validation,通过验证之后上传 S3. 现在有两个问题

    1. 如果用户使用 api endpoint 上传,跳过前端验证,后端无法在上传完毕之前知道文件大小。如何在刚开始上传的时候就检测文件大小并且阻止用户上传大文件?
    2. 目前如果用户上传文件失败或者文件比较大,占用内存过多,服务器容易直接爆炸...

    *不能直接从前端直接上传,前端只能消化内部 APIs,不能直接连 S3.

    求解决方法。
    7 条回复    2017-05-29 09:37:13 +08:00
    ponyfk
        1
    ponyfk  
       2017-05-28 13:38:44 +08:00
    按固定字节分割文件,按照分割后的子文件做 validation。validation(f1, f2, f3, ...) = validation(f)
    jiangzhuo
        2
    jiangzhuo  
       2017-05-28 14:26:40 +08:00
    看你的 validation 情况了,我们每天有很多 10G-50G 的文件也要上传到 s3,但是我们都是一行行验证 使用 stream 读入输入数据 接了一个 zlib.createGunzip() 接一个 readlinestream 然后在 readline 的 line 事件验证 最后 stream 到 s3
    楼主可以参考下
    klesh
        3
    klesh  
       2017-05-28 19:12:12 +08:00 via Android
    文件大小限制可以通过 content-length 解决, 浏览器会带有这个 header 的。超限直接抛错就行
    klesh
        4
    klesh  
       2017-05-28 19:12:55 +08:00 via Android
    至于 validation , 是什么目的的 validation? signature ?
    springmarker
        5
    springmarker  
       2017-05-28 19:21:48 +08:00
    一直很纳闷为什么只有 nodejs 的节点有这种主题色
    vinceeema
        6
    vinceeema  
    OP
       2017-05-29 07:22:18 +08:00
    @ponyfk 在前端就分隔好?
    ponyfk
        7
    ponyfk  
       2017-05-29 09:37:13 +08:00
    @vinceeema 后端分割,有一张数据库表记录分割前文件名和分割后子文件名,以及分割后所有子文件的 validation 信息,以及分割后子文件在 s3 的地址。这样无论是存/取/ validation,都可以用这张表
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5319 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:30 · PVG 16:30 · LAX 00:30 · JFK 03:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.