我对 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。
最佳答案
在这种情况下,您需要同时使用 BlobContainerClient
和 BlobClient
。执行此操作的方法是,使用 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
}
}
关于c# - 我应该使用 BlobContainerClient 还是 BlobClient 还是两者都使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74894414/