如何在 blob 存储中上传具有原始文件夹结构的文件?

how to upload files with its original folder structure in blob storage?

下面的代码会将文件上传到 blob 存储

// intialize BobClient 
            Azure.Storage.Blobs.BlobClient blobClient = new Azure.Storage.Blobs.BlobClient(
                connectionString: connectionString, 
                blobContainerName: "mycrmfilescontainer", 
                blobName: "sampleBlobFileTest");
             
            // upload the file
            blobClient.Upload(filePath);

但是如何上传所有文件并维护其文件夹结构?

我有 site 文件夹,其中包含所有 html 文件 + 图像 + css 文件夹以及网站的相关文件。

我想将完整的 site 文件夹上传到 blob 存储区,请建议方法。

请看下面的代码:

using System.Threading.Tasks;
using System.IO;
using Azure.Storage.Blobs.Specialized;

namespace SO71558769
{
    class Program
    {

        private const string connectionString = "connection-string";
        
        private const string containerName = "container-name";

        private const string directoryPath = "C:\temp\site\";
        
        static async Task Main(string[] args)
        {
            var files = Directory.GetFiles(directoryPath, "*.*", SearchOption.AllDirectories);
            for (var i=0; i<files.Length; i++)
            {
                var file = files[i];
                var blobName = file.Replace(directoryPath, "").Replace("\", "/");
                BlockBlobClient blobClient = new BlockBlobClient(connectionString, containerName, blobName);
                using (var fs = File.Open(file, FileMode.Open))
                {
                    await blobClient.UploadAsync(fs);
                }
            }
        }
    }
}

基本上这个想法是获取文件夹中所有文件的列表,然后遍历该集合并上传每个文件。

要获取 blob 名称,您只需在文件名中找到目录路径并将其替换为空字符串即可获取 blob 名称(例如,如果完整文件路径为 C:\temp\site\html\index.html,则 blob名称将是`html\index.html).

如果您使用的是 Windows,则您还需要将 \ 分隔符替换为 / 分隔符,以便获得最终的 blob 名称 html/index.html