javascript - Azure 存储 blob 库将 blob 下载到本地计算机

标签 javascript azure-blob-storage azure-storage-account azure-storage-files

我正在学习本教程,并尝试了解如何在本地计算机上下载 blob 文件

https://learn.microsoft.com/en-us/azure/storage/blobs/quickstart-blobs-javascript-browser#prerequisites

距离这里一点点 https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/storage/storage-blob#download-a-blob-and-convert-it-to-a-string-browsers

这是一个使用 JavaScript 的网络应用程序。

以下代码行运行良好,我可以在 console.log 中看到文件的内容 我希望用户能够将文件下载到本地计算机,而不是在 console.log 中看到它。所以也许给出一条路径或其他东西。

我已经评论了我需要帮助的代码。它运行但不执行任何操作。我没有看到下载到本地的消息。

const downloadFiles = async () => {
  

    if (fileList.selectedOptions.length > 0) {
        //reportStatus("downloading files...");
        for (const option of fileList.selectedOptions) {
            console.log("option.text", option.text);
            
            try {
                const blobClient = containerClient.getBlobClient(option.text);
                console.log("BlobClient",blobClient)
                
                // Hoping this line of code would do the trick
                var blobResponse = await blobClient.downloadToFile(option.text);
                //////

                const downloadBlockBlobResponse = await blobClient.download();
                console.log("downloadBlockBlobResponse", downloadBlockBlobResponse);
               const downloaded = await blobToString(await downloadBlockBlobResponse.blobBody);
               console.log("Downloaded blob to string content", downloaded);

                // [Browsers only] A helper method used to convert a browser Blob into string.
                async function blobToString(blob) {
                const fileReader = new FileReader();
                return new Promise((resolve, reject) => {
                fileReader.onloadend = (ev) => {
                    resolve(ev.target.result);
                };
                fileReader.onerror = reject;
                fileReader.readAsText(blob);
                });
              }

              // [Node.js only] A helper method used to read a Node.js readable stream into a Buffer
                async function streamToBuffer(readableStream) {
                    return new Promise((resolve, reject) => {
                    const chunks = [];
                    readableStream.on("data", (data) => {
                        chunks.push(data instanceof Buffer ? data : Buffer.from(data));
                    });
                    readableStream.on("end", () => {
                        resolve(Buffer.concat(chunks));
                    });
                    readableStream.on("error", reject);
                    });
                }
            }
            catch (error) {
                reportStatus(error.message);
            }
        }
        reportStatus("Done.");
        listFiles();
    } else {
        reportStatus("No files selected.");
    }

/*
    //const containerClient = blobServiceClient.getContainerClient(containerName);
    //console.log("containerClient", containerClient);
    const blobName =  // "MyTest1.csv";
  const blobClient = containerClient.getBlobClient(blobName);
  console.log("blobClient", blobClient);
    try {
        const downloadBlockBlobResponse = await blobClient.download();
        console.log("downloadBlockBlobResponse", downloadBlockBlobResponse);
        const downloaded = await blobToString(await downloadBlockBlobResponse.blobBody);
        console.log("Downloaded blob content", downloaded);
      
        // [Browsers only] A helper method used to convert a browser Blob into string.
        async function blobToString(blob) {
          const fileReader = new FileReader();
          return new Promise((resolve, reject) => {
            fileReader.onloadend = (ev) => {
              resolve(ev.target.result);
            };
            fileReader.onerror = reject;
            fileReader.readAsText(blob);
          });
        }
    } catch (error) {
        reportStatus(error.message);
    }
    */
};

最佳答案

downloadToFile方法仅在node.js运行时可用,因此无法使用它下载文件到本地,可以引用downloadToFile .

enter image description here

您可以尝试以下方法下载文件:

const downloadFiles = async () => {
    if (fileList.selectedOptions.length > 0) {
        reportStatus("downloading files...");
        for (const option of fileList.selectedOptions) {
            console.log("option.text", option.text);
            
            try {
                const blobClient = containerClient.getBlobClient(option.text);
                console.log("BlobClient",blobClient);

                const downloadBlockBlobResponse = await blobClient.download();
                const url =window.URL.createObjectURL(await downloadBlockBlobResponse.blobBody);
                
                downloadURI(url,option.text)
                console.log("Downloaded blob to string content", url);
            }
            catch (error) {
                reportStatus(error.message);
            }
        }
        reportStatus("Done.");
        listFiles();
    } else {
        reportStatus("No files selected.");
    }
};

downloadButton.addEventListener("click", downloadFiles);

function downloadURI(uri, name) 
{
    var link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.click();
};

关于javascript - Azure 存储 blob 库将 blob 下载到本地计算机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66270443/

相关文章:

javascript - 更改背景图像时平滑淡入淡出

azure - 使用 REST API 将 blob 复制到另一个存储帐户会出现 404 错误

azure - 仅当在具有 azure 访问权限的 Windows 帐户上运行时,使用 ClientID 访问 Blob 存储才有效

azure - 自定义 WebApi Skill 不填充索引

azure - 多个客户端访问同一 Azure Blob 容器的连接吞吐量是多少?

javascript - Discord.js 不收集用户的 DM

javascript - 用于检查表并从 jquery 添加 css 的 Chrome 扩展

javascript - 从具有输入文件元素的表单访问文件

azure - 如何使用 Azure 事件网格将多个存储帐户事件连接到一个函数

python - 如何修复在 Python 中使用 Odata 进行 Azure 存储帐户数据查询时出现 'AuthenticationFailed' 错误?