将大文件上传到 NodeJS 网络服务器
Posted
技术标签:
【中文标题】将大文件上传到 NodeJS 网络服务器【英文标题】:Uploading large file to NodeJS webserver 【发布时间】:2017-04-05 01:07:21 【问题描述】:我目前正在使用 NodeJS 服务器 (ExpressJS) 提供我的 Web 应用程序。新要求之一是用户能够将大型视频(可能是演出)上传到服务器。他们稍后将能够再次下载它们。我可以用当前的堆栈实现这一点吗?
我遇到了使用Multer JS 和前端指定的“multipart/form-data”的教程。如果我使用它,我的 Express 是否能够在将一个巨大的单个视频文件写入服务器磁盘时提供其他 HTTP 请求?
【问题讨论】:
【参考方案1】: var express = require("express");
var app = express();
var async = require('async');
var fs = require('fs');
var client = redis.createClient();
var multiparty = require('multiparty');
var util = require('util');
app.post('/',function(req,res)
var form = new multiparty.Form();
form.parse(req, function(err, fields, files)
client.get(fields.otp, function(err, reply)
var oldpath = files.file[0].path;
var newpath = path + files.file[0].originalFilename;
fs.rename(oldpath, newpath, function (err)
if (err) throw err;
res.write('File uploaded and moved!');
res.end();
);
app.listen(2001,function()
console.log("Server is running on port 2001");
);
【讨论】:
我很欣赏代码,但我不清楚multiparty
与 multer
有何不同。它也不清楚你为什么要使用 redis 客户端的东西。 multiparty example. 中没有客户 提示:可以添加 cmets 以使这些东西对其他人有帮助和清晰。为什么这个建议比上面检查的答案更好(或等于)?【参考方案2】:
我自己完成了这个(~20GB 文件,没有 multer)我可以推荐以下内容(可能大部分你已经考虑过,但为了完整性):
选择一个合适的上传控件(或者自己写,但基本上最好是分块数据。我认为我使用了 plupload)
在服务器上创建一个 API 来处理接收到的块数据,并在上传期间将其写入临时位置(您可能还需要散列并检查单个片段)。
上传完成后,检查文件(我使用客户端生成的哈希,并根据上传的数据进行检查)
【讨论】:
只是好奇,你决定不使用multer
的原因是什么?
我 4 / 5 年前做的......不要认为这个项目甚至不存在(当我做的时候,我们还在用 flash 做很多 html5 填充:O)【参考方案3】:
Multer 应该可以正常工作。它将通过 HTTP 传入的数据流式传输到磁盘上的文件。它不会锁定您的服务器。然后在您的端点中,您可以访问该文件位置并可以使用它做任何您需要的事情。
【讨论】:
附带说明:然后您只是将该文件上传到 S3 吗?如果是,您实际上可以让客户端将文件直接上传到 S3。这将使您的节点服务器不必处理 GB 的数据。 S3 可能会比您自己的服务器更快地将您的文件返回给任何人。 上传到 S3 似乎是一个不错的解决方案。看到你推荐它,我猜在安全性方面这样做是安全的吗?您肯定不希望任何人开始将文件上传到您的 S3,那么是否有某种身份验证方案? 客户端向您的 API 请求 S3 的访问令牌。您的 API 基本上使用 Amazon 提供的 S3 库创建此令牌。这是一个临时令牌,您的客户端随后将使用它连接到 S3 以上传文件。上传后,您可以使用路径或标识符回调您的 API。然后您的 API 可以随意使用 S3 文件。 有一个multer s3插件github.com/badunk/multer-s3也许有用 我正在使用 multer,但它总是先将文件加载到内存中。不将数据流式传输到磁盘,有什么想法吗?以上是关于将大文件上传到 NodeJS 网络服务器的主要内容,如果未能解决你的问题,请参考以下文章
我无法将大 (> 2GB) 文件上传到 Google Cloud Storage 网络用户界面