【问题标题】:Streaming an uploaded file to an HTTP request将上传的文件流式传输到 HTTP 请求
【发布时间】:2015-05-15 14:38:47
【问题描述】:

我的目标是接受上传的文件并使用the Wistia Upload API 将其流式传输到Wistia。我需要能够向 HTTP 请求添加字段,并且我不希望文件接触磁盘。我正在使用NodeExpressRequestBusboy

下面的代码有两个console.log 语句。第一个返回[Error: not implemented],第二个返回[Error: form-data: not implemented]。我是 Node 流媒体的新手,所以我可能在做一些根本错误的事情。任何帮助将不胜感激。

app.use("/upload", function(req, res, next) {
    var writeStream = new stream.Writable();
    writeStream.on("error", function(error) {
        console.log(error);
    });
    var busboy = new Busboy({headers: req.headers});
    busboy.on("file", function(fieldname, file, filename, encoding, mimetype) {
        file.on("data", function(data) {
            writeStream.write(data);
        });
        file.on("end", function() {
            request.post({
                url: "https://upload.wistia.com",
                formData: {
                    api_password: "abc123",
                    file: new stream.Readable(writeStream)
                }
            }, function(error, response, body) {
                console.log(error);
            });
        });
    });
    req.pipe(busboy);
});

【问题讨论】:

    标签: node.js express node-request busboy wistia


    【解决方案1】:

    我不熟悉 busboy 模块,但您遇到的错误是由于尝试使用未实现的流。每当您直接从stream 模块创建新的可读或可写流时,您必须分别创建_read_write 方法Stream Implementors (node.js api)。为了让您可以使用以下示例,使用 multer 处理多部分请求,我想您会发现 multer 比 busboy 更易于使用。

    var app = require('express')();
    var fs = require('fs');
    var request = require('request');
    app.use(multer());
    
    app.post("/upload", function(req, res, next) {
        // create a read stream
        var readable = fs.createReadStream(req.files.myfile.path);
        request.post({
            url: "https://upload.wistia.com",
            formData: {
                api_password: "abc123",
                file: readable
            }    
        }, function(err, res, body) {
            // send something to client
        })
    });
    

    我希望这会有所帮助,不幸的是我不熟悉 busboy,但这应该适用于 multer,正如我之前所说的那样,问题只是您使用的是未实现的流,我确信有一种方法可以配置它如果你愿意,可以和 busboy 一起操作。

    【讨论】:

    • 谢谢!看起来 multer 是建立在 busboy 之上的,所以我试一试。
    • 再次感谢。我以前从未见过 multer——它非常好。我希望直接从传入请求流式传输到传出请求(而不将整个文件存储在内存中),但我不确定这是否可能。 Multer 至少有inMemory 选项,但我不确定这有多安全。我可能只是将文件写入磁盘,但感谢您的提示。
    • 是的,我看错了,只是看到您正在寻找一种磁盘外方法。我个人没有尝试过inMemory 选项,希望能成功。
    • @DavidJones 已经有一段时间了,但我现在也在探索这个想法。你最终决定了什么?在内存中保存几 MB 文件而不是写入磁盘是不是很疯狂?
    【解决方案2】:

    如果你想使用 multipart(另一个 npm),这里有一个教程: http://qnimate.com/stream-file-uploads-to-storage-server-in-node-js/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 2013-03-11
      • 2011-01-25
      相关资源
      最近更新 更多