【发布时间】:2013-08-21 11:48:38
【问题描述】:
将 Express 与 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。在这个过程中,这似乎是一个低效且不必要的步骤,我最终不得不管理临时文件目录的清理。
我应该能够使用 Azure SDK 中的 blobService.createBlockBlobFromStream 方法将文件直接流式传输到 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?
【问题讨论】:
-
我不熟悉节点,但Github page 可能会提供提示。
var stream = fs.createReadStream(req.files.snapshot.path);其中fs定义为var fs = require('fs'); -
@Romoku 不幸的是,
req.files.snapshot.path是磁盘上文件的路径。我需要在它变成实际文件之前捕获它。 -
从我读到的
bodyParser中间件处理将文件写入磁盘。据我所知,您需要实现自己的中间件,以便在文件写入磁盘之前拦截文件。 -
还要考虑不将文件写入磁盘的含义。您将失去持久性并增加应用程序内存占用。
标签: node.js azure express azure-blob-storage