将大文件上传到 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");
);

【讨论】:

我很欣赏代码,但我不清楚 multipartymulter 有何不同。它也不清楚你为什么要使用 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 网络服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何将大 (> 25MB) 文件上传到 Web 服务?

我无法将大 (> 2GB) 文件上传到 Google Cloud Storage 网络用户界面

我应该如何批量上传到 s3 并通过最终回调从 nodeJS 网络服务器插入到 MongoDB?

支持恢复将大文件上传到 S3

支持恢复将大文件上传到 S3

node批量读取本地图片并上传