azure 我应该使用BlobContainerClient还是BlobClient,还是两者都使用?

6ojccjat  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(139)

我对C# azure sdk感到困惑。
我想达到的目标。
将文件从我的计算机上载到azure中的文件夹。
例如
当地

MyFiles 
   -- Folder1
     -- file.txt
     -- img.jpg
   -- Folder2
      -- file2.json
      -- test.png

Azure结果

Container
     MyFiles 
           -- Folder1
             -- file.txt
             -- img.jpg
           -- Folder2
              -- file2.json
              -- test.png

所以我想在我的容器上的azure相同的文件结构。
我是怎么做的

var sasCred = new AzureSasCrdentials("sasurl");
var container = new BlobContainerClient(new Uri("containerUrl"), sasCred);

var allFiles = Directory.GetFiles("MyFilesFolderPath", "*", SearchOption.AllDirectories);

foreach(var file in files)
{
   var cloudFilePath = file.Replace("MyFilesFolderPath", string.Empty);
   var fullPath= $"MyFiles{cloudFilePath};

  using(var s = new MemoryStream(File.ReadAllBytes(file))
  {
     await container.UploadBlobAsync(fullPath,stream); 
  }
}

这似乎做了我需要它做的事情,虽然我注意到文件类型是类似于“文件八位字节流”,而不是.json/.png/txt或任何它应该是。
当我搜索时,它谈到使用BlobCLient来设置文件类型,但现在我确定我是否应该使用BlobContainerClient。

oprakyz7

oprakyz71#

若要使用Azure Blob存储中的BlobContainerClient类设置容器中Blob的内容类型,可以使用SetBlobProperties方法并将BlobHttpHeaders类的ContentType属性指定为所需的内容类型。
也有nuget库可以从文件扩展名中获取mime类型,如果它们随上传而变化的话。

BlobHttpHeaders headers = new BlobHttpHeaders
    {
        ContentType = "text/plain"
    };
    container.SetBlobProperties(blobName, headers: headers);
lnvxswe2

lnvxswe22#

在这种情况下,您需要同时使用BlobContainerClientBlobClient,您可以使用BlobContainerClient和blob名称创建BlobClient(具体为BlockBlobClient)的示例,并在其中使用UploadAsync方法。
您的代码(未经测试)如下所示:

var sasCred = new AzureSasCrdentials("sasurl");
var container = new BlobContainerClient(new Uri("containerUrl"), sasCred);

var allFiles = Directory.GetFiles("MyFilesFolderPath", "*", SearchOption.AllDirectories);

foreach(var file in files)
{
   var cloudFilePath = file.Replace("MyFilesFolderPath", string.Empty);
   var fullPath= $"MyFiles{cloudFilePath};

  using (var s = new MemoryStream(File.ReadAllBytes(file))
  {
      var blockBlob = container.GetBlockBlobClient(fullPath);//Get BlockBlobClient instance
      var blobContentType = GetContentTypeFromFileSomehow(file);//Write a helper method to get the content type
      var headers = new BlobHttpHeaders() { ContentType = blobContentType};//Set content type header for blob.
      var blobUploadOptions = new BlobUploadOptions() { HttpHeaders = headers};
      await blockBlob.UploadAsync(s, blobUploadOptions);//Upload blob 
  }
}

相关问题