上传文件到 S3 内存管理

2017-05-28 13:11:19 +08:00
 vinceeema
目前结构是前端把文件上传至 node 后端,然后后端上传到 S3. 目前前端后端都做了 validation. 但是如果直接通过 api endpoint 上传,后端会把所有东西先 load 到内存后才能做 validation,通过验证之后上传 S3. 现在有两个问题

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

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

求解决方法。
2823 次点击
所在节点    Node.js
7 条回复
ponyfk
2017-05-28 13:38:44 +08:00
按固定字节分割文件,按照分割后的子文件做 validation。validation(f1, f2, f3, ...) = validation(f)
jiangzhuo
2017-05-28 14:26:40 +08:00
看你的 validation 情况了,我们每天有很多 10G-50G 的文件也要上传到 s3,但是我们都是一行行验证 使用 stream 读入输入数据 接了一个 zlib.createGunzip() 接一个 readlinestream 然后在 readline 的 line 事件验证 最后 stream 到 s3
楼主可以参考下
klesh
2017-05-28 19:12:12 +08:00
文件大小限制可以通过 content-length 解决, 浏览器会带有这个 header 的。超限直接抛错就行
klesh
2017-05-28 19:12:55 +08:00
至于 validation , 是什么目的的 validation? signature ?
springmarker
2017-05-28 19:21:48 +08:00
一直很纳闷为什么只有 nodejs 的节点有这种主题色
vinceeema
2017-05-29 07:22:18 +08:00
@ponyfk 在前端就分隔好?
ponyfk
2017-05-29 09:37:13 +08:00
@vinceeema 后端分割,有一张数据库表记录分割前文件名和分割后子文件名,以及分割后所有子文件的 validation 信息,以及分割后子文件在 s3 的地址。这样无论是存/取/ validation,都可以用这张表

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/364420

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX