将大文件上传到NodeJS网络服务器
我现在正在使用NodeJS服务器(ExpressJS)提供我的Web应用程序。新的要求之一是用户能够将大型视频(可能在演出中)上传到服务器。他们稍后将能够再次下载它们。我可以用当前的堆栈来实现吗?将大文件上传到NodeJS网络服务器
我遇到了使用Multer JS与前端指定的“multipart/form-data”的教程。如果我使用它,我的Express能够在向服务器磁盘写入巨大的单个视频文件时提供其他HTTP请求吗?
Multer应该可以正常工作。它将通过HTTP将数据流传输到磁盘上的文件。它不会锁定你的服务器。然后,在您的端点中,您可以访问该文件位置,并可以根据需要执行任何操作。
有这个做自己(〜20GB的文件,无需multer)我可以推荐以下(可能其中大部分你已经考虑过,但出于完整性):
选择合适的上传控件(或写你自己的,但基本的东西,口吃了起来的数据是最好的。我用plupload我认为)
在服务器上进行API来处理接收到的块数据,并上传期间写出来到一个临时位置(您也可能希望散列和检查单个作品)。
一旦上传完成后,检查文件(我使用的客户端生成一个散列,并检查其对上传的数据)
只是好奇,是否有你决定不使用'multer'的原因? – Randy
我在4/5年前就做到了......不要认为这个项目甚至存在(当我这样做的时候,我们仍然用闪光灯做了很多HTML5补光:O) –
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");
});
在一个侧面说明:你那么就上传该文件到S3?如果你是,你实际上可以让客户端直接将文件上传到S3。这将使您的节点服务器不必处理GB的数据。而且S3可能会将您的文件恢复到比您自己的服务器更快的速度。 – Randy
上传到S3似乎是一个很好的解决方案。看到你在推荐它时,我认为在安全性方面做到这一点是安全的?当然你不希望任何人开始向你的S3上传文件,那么是否有某种认证方案? – jiminssy
客户端向您的API请求访问令牌给S3。您的API基本上使用Amazon提供的S3库创建此令牌。这是一个临时令牌,您的客户端将使用它连接到S3以上载文件。上传后,您可以使用路径或标识符回拨至您的API。然后,您的API可以使用S3文件,但它是可取的。 – Randy