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

Uploading large file to NodeJS webserver

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

我遇到了前端指定使用 Multer JS 和 "multipart/form-data" 的教程。如果我使用它,我的 Express 是否能够在将一个巨大的单个视频文件写入服务器磁盘的同时处理其他 HTTP 请求?

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

我自己完成了这个(~20GB 文件,没有 multer)我可以推荐以下内容(可能大部分你已经考虑过,但为了完整性):

  1. 选择一个合适的上传控件(或者自己写一个,但基本上最好是能把数据分块的东西。我想我用的是plupload)

  2. 在服务器上制作一个API来处理接收到的块数据,并在上传过程中将其写到一个临时位置(您可能还想散列并检查各个部分) .

  3. 上传完成后,检查文件(我使用了客户端生成的哈希值,并根据上传的数据进行了检查)

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