【问题标题】:Uploading large file to NodeJS webserver将大文件上传到 NodeJS 网络服务器
【发布时间】:2017-04-05 01:07:21
【问题描述】:

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

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

【问题讨论】:

    标签: node.js express multer


    【解决方案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)我可以推荐以下内容(可能大部分你已经考虑过,但为了完整性):

    1. 选择一个合适的上传控件(或者自己写,但基本上最好是分块数据。我认为我使用了 plupload)

    2. 在服务器上创建一个 API 来处理接收到的块数据,并在上传期间将其写入临时位置(您可能还需要散列并检查单个片段)。

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

    【讨论】:

    • 只是好奇,你决定不使用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,但它总是先将文件加载到内存中。不将数据流式传输到磁盘,有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 2014-12-11
    • 2012-10-28
    • 2011-01-09
    • 2011-02-05
    • 2019-02-06
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多