需要帮助使用NodeJS从Azure Blob下载图像

时间:2019-01-29 13:42:47

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

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

快速入门中代码的下载部分对我来说并不那么清楚,因为上载也似乎是针对文本的。如果我进入Azure存储仪表板,则可以看到该容器,并且可以看到使用该图像创建的Blob,并且可以单击该图像并将其加载到另一页中。但是,如果我转到属性并选择Uri:https://facerstorage.blob.core.windows.net/a00008/sun.png 并将其粘贴到我的浏览器中,我得到:
enter image description here

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

不确定这是怎么回事

我使用了来自nodejs blobs快速启动的代码,用于下载的代码如下:

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访问图像,但是我得到了上面显示的错误。不确切知道这两个还有什么作用。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

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

这是Node中用于生成带有SAS签名的blob网址的示例代码,该代码来自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);

注意:上面的代码基于通过azure-storage的npm软件包npm install azure-storage v2,而不是通过v10-Preview的预览版本npm i @azure/storage-blob或遵循官方文档{{3} } 安装。对于使用v10 API来生成SAS url,您可以参考我的Java中的SO Quickstart: Upload, download, list, and delete blobs using Azure Storage v10 SDK for JavaScript (preview)代码,这些API与Node的API类似。

或者只是将普通的Blob网址与令牌连接在一起,以获取如下所示的SAS网址,因此您只需生成一个令牌即可应用于任何Blob网址的末尾。

var sasUrl = blobUrl + token;

然后,您可以将URL与SAS一起使用,以通过<img src="<sas url>">在浏览器中显示,也可以使用Http客户端直接下载它,而无需进行任何其他身份验证,直到到期为止。