【问题标题】:Need help downloading image from Azure Blobs using NodeJS需要帮助使用 NodeJS 从 Azure Blobs 下载图像
【发布时间】:2019-06-22 15:54:37
【问题描述】:

我从 azure 的 NodeJS Blob 快速入门中获得了大部分代码,我能够成功上传包括图像在内的文件,并且可以在 azure 存储仪表板中看到它们。但我似乎无法下载它们或获取它们的 URL,我需要数据库的 url,以便我可以查询它并使用 url 来检索文件。

快速入门中代码的下载部分对我来说不是很清楚,它似乎是为文本制作的,因为上传也是如此。如果我进入我的 azure 存储仪表板,我可以看到容器,我可以看到使用图像创建的 blob,我可以单击图像并将其加载到另一个页面中。但是,如果我转到属性并选择 Uri:https://facerstorage.blob.core.windows.net/a00008/sun.png 并将其粘贴到我的浏览器中,我得到:

我还打印了从 blockBlobURL 返回的 url,它与上面 blob 仪表板中的 Uri 中的相同,尽管它在 a0009 和 sun.png 之间有一个“/./”,它被删除例如浏览器:https://facerstorage.blob.core.windows.net/a00009/./sun.png" 相同,我得到相同的错误。

不知道这里出了什么问题

我使用了nodejs blobs quickstart的代码,下载的代码如下:

const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, content);
console.log("The blobs URL is: " + JSON.stringify(blockBlobURL.url));
const downloadResponse = await blockBlobURL.download(aborter, 0);
downloadedContent = downloadResponse.readableStreamBody.read(content.length)//.toString();
console.log(`Downloaded blob content: "${downloadedContent}"`);

我没有 BlockBlobURL.download 函数的代码,也不明白是什么:

  const downloadResponse = await blockBlobURL.download(aborter, 0);
    downloadedContent = downloadResponse.readableStreamBody.read(content.length)//.toString();

正在做。

我认为从上面的 url 我应该已经能够从该 url 访问图像,但我得到了如上所示的错误。不知道这两个到底是做什么的。

感谢您的帮助。

【问题讨论】:

  • 这可能意味着您的存储不公开。您需要在尝试下载时将其设置为公开或正确验证
  • 我在哪里可以设置并阅读任何链接,我在快速入门指南中没有看到任何相关内容?而且当它运行下载响应和下载内容时,它不需要任何东西就可以工作。
  • 这谈到了创建容器和设置访问级别:docs.microsoft.com/en-us/azure/storage/blobs/… 也检查一下:docs.microsoft.com/en-us/azure/storage/blobs/…
  • 会看看谢谢老兄

标签: node.js azure-storage azure-blob-storage


【解决方案1】:

听起来您想下载或显示存储在 Azure Blob 存储中的图像,但这些图像的容器不是公开的。与 SO 线程 Azure file image path using java 非常相似。

解决方法是生成一个带有SAS签名的blob url,用于下载或直接显示在浏览器中,可以参考官方文档Using shared access signatures (SAS)Manage anonymous read access to containers and blobs了解概念。

这里是Node中生成带有SAS签名的blob url的示例代码,来自here

要创建共享访问签名 (SAS),请使用 generateSharedAccessSignature 方法。此外,您可以使用日期辅助函数轻松创建在相对于当前时间的某个时间点到期的 SAS。

var azure = require('azure-storage');
var blobService = azure.createBlobService();

var startDate = new Date();
var expiryDate = new Date(startDate);
expiryDate.setMinutes(startDate.getMinutes() + 100);
startDate.setMinutes(startDate.getMinutes() - 100);

var sharedAccessPolicy = {
  AccessPolicy: {
    Permissions: azure.BlobUtilities.SharedAccessPermissions.READ,
    Start: startDate,
    Expiry: expiryDate
  }
};

var token = blobService.generateSharedAccessSignature(containerName, blobName, sharedAccessPolicy);
var sasUrl = blobService.getUrl(containerName, blobName, token);

注意:以上代码基于npm包azure-storage v2 via npm install azure-storage,而不是预览版v10-Preview via npm i @azure/storage-blob或按照官方文档Quickstart: Upload, download, list, and delete blobs using Azure Storage v10 SDK for JavaScript (preview)安装。对于使用v10 APIs 来生成 SAS url,您可以参考我的代码 for SO tram Azure file image path using java in Java,这些 API 与 Node.js 的 API 类似。

或者只是将普通的 blob url 与 token 连接起来,以获得一个带有 SAS 的 url,如下所示,因此您可以生成一个 token 以应用于任何 blob url 的末尾。

var sasUrl = blobUrl + token;

然后,您可以使用带有 SAS 的 url 通过<img src="<sas url>"> 在浏览器中显示或使用 Http 客户端直接下载它,无需任何额外的身份验证,直到到期时间。

【讨论】:

  • 谢谢 Allot,我肯定会检查一下,我看到了如何从 azure 仪表板公开容器并使用它来启动并运行它,但明天我会看看我是否可以使用这个看起来更好的系统。
猜你喜欢
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2015-08-06
  • 1970-01-01
  • 2014-10-25
  • 2012-12-04
  • 2017-04-08
相关资源
最近更新 更多