将大文件上传到NodeJS网络服务器

问题描述:

我现在正在使用NodeJS服务器(ExpressJS)提供我的Web应用程序。新的要求之一是用户能够将大型视频(可能在演出中)上传到服务器。他们稍后将能够再次下载它们。我可以用当前的堆栈来实现吗?将大文件上传到NodeJS网络服务器

我遇到了使用Multer JS与前端指定的“multipart/form-data”的教程。如果我使用它,我的Express能够在向服务器磁盘写入巨大的单个视频文件时提供其他HTTP请求吗?

Multer应该可以正常工作。它将通过HTTP将数据流传输到磁盘上的文件。它不会锁定你的服务器。然后,在您的端点中,您可以访问该文件位置,并可以根据需要执行任何操作。

+1

在一个侧面说明:你那么就上传该文件到S3?如果你是,你实际上可以让客户端直接将文件上传到S3。这将使您的节点服务器不必处理GB的数据。而且S3可能会将您的文件恢复到比您自己的服务器更快的速度。 – Randy

+0

上传到S3似乎是一个很好的解决方案。看到你在推荐它时,我认为在安全性方面做到这一点是安全的?当然你不希望任何人开始向你的S3上传文件,那么是否有某种认证方案? – jiminssy

+0

客户端向您的API请求访问令牌给S3。您的API基本上使用Amazon提供的S3库创建此令牌。这是一个临时令牌,您的客户端将使用它连接到S3以上载文件。上传后,您可以使用路径或标识符回拨至您的API。然后,您的API可以使用S3文件,但它是可取的。 – Randy

有这个做自己(〜20GB的文件,无需multer)我可以推荐以下(可能其中大部分你已经考虑过,但出于完整性):

  1. 选择合适的上传控件(或写你自己的,但基本的东西,口吃了起来的数据是最好的。我用plupload我认为)

  2. 在服务器上进行API来处理接收到的块数据,并上传期间写出来到一个临时位置(您也可能希望散列和检查单个作品)。

  3. 一旦上传完成后,检查文件(我使用的客户端生成一个散列,并检查其对上传的数据)

+0

只是好奇,是否有你决定不使用'multer'的原因? – Randy

+1

我在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"); 
});