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

Azure storage blob library download blob to local machine

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

https://docs.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.

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

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();
};