如何使用 JavaScript v12 SDK for Browsers 检索和显示(在浏览器中)存储在 Azure 存储帐户中的多个 pdf 的 URL
Posted
技术标签:
【中文标题】如何使用 JavaScript v12 SDK for Browsers 检索和显示(在浏览器中)存储在 Azure 存储帐户中的多个 pdf 的 URL【英文标题】:How to retrieve and display (in browser) urls for multiple pdf's stored in an azure storage account using JavaScript v12 SDK for Browsers 【发布时间】:2020-12-22 01:33:40 【问题描述】:我是 azure 的新手,并尝试循环访问存储帐户 > 容器以获取存储的每个 pdf 文档的 URL/URI。然后我希望将 URL 用作 href 标记的值,因此当用户单击链接时,它会在浏览器中显示 PDF 或下载它。我知道如何创建一个 href,但我不知道如何检索 pdf 的 URL。
我开始使用Quickstart: Manage blobs with javascript v12 SDK in a browser,这有点帮助,但我无法确定我需要做什么才能获得每个 PDF 的链接以显示在网站上。
此时我的 JavaScript 代码很简单,并且几乎遵循快速入门。代码(listFiles 函数)当前正确显示文件名,但我不知道如何获取它的 href 值。我一直在尝试在SDK docs 中查找信息,但没有成功。还有另一篇***文章谈到了它,但没有提供足够的细节。这是我的 JavaScript 代码:
index.js
const BlobServiceClient = require("@azure/storage-blob");
const main = document.getElementById("main");
// Update <placeholder> with your Blob service SAS URL string
const blobSasUrl = "<myblobservicesasurlstring>";
// Create a new BlobServiceClient
const blobServiceClient = new BlobServiceClient(blobSasUrl);
// Create a unique name for the container by
// pdfs container already exists in blob storage
const containerName2 = "pdfs";
// Get a container client from the BlobServiceClient
const containerClient = blobServiceClient.getContainerClient(containerName2);
const listFiles = async () =>
main.innerhtml = "";
try
let iter = containerClient.listBlobsFlat();
let blobItem = await iter.next();
while (!blobItem.done)
main.innerHTML += `<a href='$blobItem.uri'>$blobItem.value.name</a>`;
blobItem = await iter.next();
catch (error)
console.log(error.message);
;
window.addEventListener("load", listFiles);
【问题讨论】:
【参考方案1】:你有两个选择:
您有一个 SAS 链接,我假设它是用于存储帐户或容器的,因为您可以从中列出您的 blob。您的帐户看起来像这样https://storageaccountname.blob.core.windows.net/?keyinfo
。特定文件的文件名相同,但路径中包含容器和文件名。 https://storageaccountname.blob.core.windows.net/containername/filename?keyinfo
而不是 href 属性,而是使用您的 blobClient 在 JS 中生成下载的链接。它更干净一些,但最终结果相同,因此取决于您的喜好。您可以查看包含执行此操作的示例here。
代码总结(也借用一点this的回答):
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
const downloadBlockBlobResponse = await blockBlobClient.download(0);
const data = await downloadBlobResponse.blobBody;
// Saves file to the user's downloads directory
saveAs(data, blobName); // FileSaver.js
【讨论】:
【参考方案2】:这是我为解决问题所做的,它可能不是最直接的方法,但它有效:
const BlobServiceClient, BlobClient = require("@azure/storage-blob");
const main = document.getElementById("main");
// Update <placeholder> with your Blob service SAS URL string
const blobSasUrl = "<MyBlobServiceSASURL>";
// Create a new BlobServiceClient
const blobServiceClient = new BlobServiceClient(blobSasUrl);
const _connectionString = "<myconnectionstring>";
const _containerName = "pdfs";
// Get a container client from the BlobServiceClient
const containerClient = blobServiceClient.getContainerClient(_containerName);
const listFiles = async () =>
main.innerHTML = "";
try
let iter = containerClient.listBlobsFlat();
let blobItem = await iter.next();
while (!blobItem.done)
let _blobName2 = blobItem.value.name;
let blobClient = new BlobClient(_connectionString, _containerName, _blobName2);
main.innerHTML += `<div><a href='$blobClient.url'>$blobItem.value.name</a></div>`;
blobItem = await iter.next();
catch (error)
console.log(error.message);
;
window.addEventListener("load", listFiles);
【讨论】:
以上是关于如何使用 JavaScript v12 SDK for Browsers 检索和显示(在浏览器中)存储在 Azure 存储帐户中的多个 pdf 的 URL的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 .NET v12 SDK 在 Azure Blob 存储中上传具有指定 ContentType 的 Blob?
如何使用最新的 Azure SDK .NET API v12 在 Blob 上获取共享访问签名?
如何从适用于 Node.js 的 Azure blob v12 SDK 中删除 blob
上传大文件 Azure Blob .net SDK v12 问题
使用 Azure Java SDK V12 和 ListBlobs() 在 Azure Blobstorage 中列出 Blob 非常慢
与 v11 相比,使用 v12 将文件上传到 Azure Blob 存储 SDK 的 ASP.NET Core 使用更高的内存