使用Node将上传的文件流式传输到Azure Blob存储
通过使用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.createBlockBlobFromStream
Azure
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,以帮助您找到解决方案。
以上是 使用Node将上传的文件流式传输到Azure Blob存储 的全部内容, 来源链接: utcz.com/qa/422777.html