当前位置: 首页 > 面试题库 >

使用Node将上传的文件流式传输到Azure Blob存储

太叔烨霖
2023-03-14
问题内容

通过使用Express with Node,我可以成功上传文件,并通过以下代码块将其传递到Azure存储。

app.get('/upload', function (req, res) {
    res.send(
    '<form action="/upload" method="post" enctype="multipart/form-data">' +
    '<input type="file" name="snapshot" />' +
    '<input type="submit" value="Upload" />' +
    '</form>'
    );
});

app.post('/upload', function (req, res) {
    var path = req.files.snapshot.path;
    var bs= azure.createBlobService();
    bs.createBlockBlobFromFile('c', 'test.png', path, function (error) { });
    res.send("OK");
});

这很好用,但是Express创建一个临时文件并首先存储图像,然后将其从文件上传到Azure。这似乎是该过程中效率低下和不必要的步骤,而我最终不得不管理临时文件目录的清理。

我应该能够使用blobService.createBlockBlobFromStreamAzure
SDK中的方法将文件直接流式传输到Azure存储,但是我对Node或Express不够熟悉,无法理解如何访问流数据。

app.post('/upload', function (req, res) {

    var stream = /// WHAT GOES HERE ?? ///

    var bs= azure.createBlobService();
    bs.createBlockBlobFromStream('c', 'test.png', stream, function (error) { });
    res.send("OK");
});

我发现以下博客表明可能有一种方法,当然Express也在抓取流数据并将其解析并保存到文件系统中。http://blog.valeryjacobs.com/index.php/streaming-
media-from-url-to-blob-
storage/

vjacobs代码实际上是从另一个站点下载文件并将该流传递到Azure,因此我不确定它是否可以适应我的情况。

如何使用Node访问上传的文件流并将其直接传递到Azure?


问题答案:

解决方案 (基于与@danielepolencic的讨论)

使用Multiparty(npm install
multiparty),这是Formidable的一个分支,如果我们从Express禁用bodyparser()中间件,则可以访问多部分数据(有关更多信息,请参见他们的注释)。与Formidable不同,除非您告知,否则Multiparty不会将文件流传输到磁盘。

app.post('/upload', function (req, res) {
    var blobService = azure.createBlobService();
    var form = new multiparty.Form();
    form.on('part', function(part) {
        if (part.filename) {

            var size = part.byteCount - part.byteOffset;
            var name = part.filename;

            blobService.createBlockBlobFromStream('c', name, part, size, function(error) {
                if (error) {
                    res.send({ Grrr: error });
                }
            });
        } else {
            form.handlePart(part);
        }
    });
    form.parse(req);
    res.send('OK');
});

支持@danielepolencic,以帮助您找到解决方案。



 类似资料:
  • 问题内容: 我正在尝试使用aws-sdk或knox将通过表单提交的文件直接上传到Amazon S3存储桶。表单处理非常强大。 我的问题是:如何使用这些库的最新功能来正确处理aws-sdk(或knox)的强大功能? 但是,我认为答案有点过时和/或偏离主题(例如,出于各种原因,我现在不希望使用CORS支持),和/或最重要的是,请勿参考的最新功能。要么是aws- sdk(请参阅:https : //gi

  • 问题内容: 我有一个200MB的文件,想通过下载提供给用户。但是,由于我们希望用户仅下载一次此文件,因此我们这样做: 强制下载。但是,这意味着整个文件必须加载到内存中,这通常不起作用。我们如何以每块kb的速度将文件流式传输给他们? 问题答案: 尝试这样的事情

  • 问题内容: 我试图了解如何使用Node.js在Firebase Storage中上传文件。我的第一次尝试是使用Firebase库: 但是事实证明,Firebase无法从服务器端上传文件,正如在文档中明确指出的那样: Firebase存储不包含在服务器端Firebase npm模块中。相反,您可以使用gcloud Node.js客户端。 在代码中,您可以使用以下方式访问存储分区: 我们可以在没有Go

  • 我正试图通过我的服务器将一个二进制文件从客户端请求流到谷歌云存储。 我使用Tornado框架将数据从请求流到服务器,并使用Google Cloud Storage API将文件流到Google-方法。 我是Tornado的新手,我正在使用装饰器,这样我就可以从请求中获取数据块,并将每个块上传到Google。 我试着打开一个类似文件的对象,我可以在将文件本身上传到谷歌的同时编写每一个块。 问题是,我

  • 问题内容: 看起来Spring 不能将响应直接流式传输到文件而不将其全部缓存在内存中。使用较新的Spring 5实现此目标的合适方法是什么? 我看到人们已经找到了解决此问题的一些变通方法/技巧,但是我对使用正确的方法更感兴趣。 有许多用于下载二进制数据的示例,但几乎所有示例都将其加载到内存中。 问题答案: 使用最近稳定的Spring WebFlux(截至撰写时为5.2.4.RELEASE): 对我

  • Spring似乎无法将响应直接流式传输到文件,而不将其全部缓冲在内存中。使用较新的Spring 5实现这一点的正确方法是什么? 我看到人们在中找到了一些解决此问题的方法,但我更感兴趣的是使用以正确的方式解决此问题。 有许多使用下载二进制数据的示例,但几乎所有示例都将加载到内存中。