如何阅读 Azure Blob 网址?

Posted

技术标签:

【中文标题】如何阅读 Azure Blob 网址?【英文标题】:How to read Azure Blob Url? 【发布时间】:2021-09-15 20:10:18 【问题描述】:

我正在创建 react 和 express/Azure SQL db 中的博客文章列表。我可以使用 Azure blob 存储来存储与帖子关联的图像。我还能够获取 blob url,并将其存储在我的 SQL 数据库中。但是,当我想直接读取 url 时,它抛出了一个找不到资源的错误。在搜索文档和其他 *** 答案后,我可以推断它与 SAS 令牌有关。谁能解释一下解决这个问题的更好方法是什么?

https://yourdomain.blob.core.windows.net/imagecontainer/yourimage.png

下面是nodejs代码。

router.post('/image', async function (req, res) 
try 
    console.log(req.files.files.data);
    const blobName = 'test' + uuidv1() + '.png';
    const containerClient = blobServiceClient.getContainerClient(containerName);
    const blockBlobClient = containerClient.getBlockBlobClient(blobName);
    const uploadBlobResponse = await blockBlobClient.upload(req.files.files.data, req.files.files.data.length)
    res.send(tempUrl:blockBlobClient.url); 

     catch (e) 
      console.log(e);
    
)

【问题讨论】:

您的应用程序是否打算成为公共应用程序?或者您是否想让 blob 仅按需访问,例如当有人访问您应用程序上的特定页面时? @GauravMantri 我想选择第二个选项,即按需访问。 【参考方案1】:

但是,当我想直接读取 url 时,它抛出了一个错误 找不到资源。

您很可能会收到此错误,因为包含 blob 的 blob 容器具有 Private ACL,并且因此禁用了匿名访问。要启用匿名访问,请将 blob 容器的 ACL 更改为 BlobPublic 即可解决此问题。

如果您不能(或不想)更改 blob 容器的 ACL,其他选择是在 blob 上创建 Shared Access Signature (SAS)。 SAS 本质上提供了对 blob 的时间和权限限制访问。根据您的需要,您需要创建一个仅具有 Read 权限的短期 SAS 令牌。

要生成 SAS 令牌,您需要使用 generateBlobSASQueryParameters 方法。创建 SAS 令牌后,您需要将其附加到 Blob 的 URL 以获取 SAS URL。

这是执行此操作的示例代码。它使用@azure/storage-blob节点包。

const permissions = new BlobSASPermissions();
permissions.read = true;//Set read permission only.
const currentDateTime = new Date();
const expiryDateTime = new Date(currentDateTime.setMinutes(currentDateTime.getMinutes()+5));//Expire the SAS token in 5 minutes.
var blobSasModel = 
    containerName: 'your-blob-container-name',
    blobName: 'your-blob-name',
    permissions: permissions,
    expiresOn: expiryDateTime
;

const sharedKeyCredential = new StorageSharedKeyCredential('your-storage-account-name', 'your-storage-account-key');
const sasToken = generateBlobSASQueryParameters(blobSasModel, sharedKeyCredential);
const sasUrl = blockBlobClient + "?" + sasToken;//return this SAS URL to the client.

【讨论】:

以上是关于如何阅读 Azure Blob 网址?的主要内容,如果未能解决你的问题,请参考以下文章

索引 Azure 存储上的加密 Blob

如何在 azure 中上传文件后获取 blob-URL

Azure Blob 存储与文件服务 [关闭]

从 API 身份验证返回的 Azure Blob SAS 网址失败 .net 核心

Azure Blob 存储 - 显示上传的图像时出错

Azure Blob (pyarrow) 上的分区 Parquet 文件