不要覆盖 Azure Blob 存储
Don't Overwrite Azure Blob Storage
我有一种将文件添加到 Azure Blob 存储的方法问题是我试图指定一个条件,在该条件下它不会覆盖 blob,而只是添加到它。我正在尝试使用参数访问条件,但是 VS 说此方法不能采用两个参数-
async void archiveNewImportedImages(列出图像文件)
{
// Saving the images
// Retrieve reference to a blob named "myblob".
// Create or overwrite the "myblob" blob with contents from a local file.
using (var fileStream = System.IO.File.OpenRead(@"C:\Users\rahulchawla\Desktop\FilezilleIMGS\FilezilleIMGS\MTO_Image\CR01-1-20170623-1327.jpg"))
{
await blockBlob.UploadFromStreamAsync(fileStream, accessCondition: AccessCondition.GenerateIfNoneMatchCondition("*"));
}
// save url of the image into a variable and later to the database
/// fileURL = blockBlob.Uri.ToString();
}
有什么建议吗?
最终目标:不要覆盖容器 - 继续添加不同的文件,例如。 img1.jpg、img2.jpg 到 blob
其他详细信息:想要将图像附加到容器(换句话说,继续将图像添加到容器)。如果文件存在,则不想覆盖现有文件)
根据设计,如果您尝试上传具有相同 blob 名称的新内容,Azure Blob 存储将覆盖 blob 的内容。
如果您不想覆盖内容,您可以做一些事情,但您将不得不为其编写代码。
- 在上传之前检查 blob 是否存在并使上传操作失败,并通知用户为 blob 选择另一个名称或在您的代码中指定一个新名称。您可以通过调用
blob.ExistsAsync
来检查 blob 是否存在,或者像您当前所做的那样使用访问条件执行操作。在第一种情况下,您将得到一个 true/false 值,并根据该值决定您想要做什么。在第二种情况下,上传操作将失败 PreConditionNotMet (412 Status Code)
因此您需要捕获异常并决定要做什么。
- 如果您打算保留所有更改的历史记录,那么您应该查看 Azure Blob 存储中可用的
blob snapshot
功能。当您拍摄 blob 的快照时,它会创建 blob 的只读副本。但是请记住,在这种情况下,只有一个 blob 和许多快照。每个快照在拍摄快照时都由 date/time 唯一标识。您可以获取一个 blob 及其快照,以查看对该 blob 所做更改的历史记录。
现在有一个 CloudAppendBlob
class 允许您将内容添加到现有的 blob :
var account = CloudStorageAccount.Parse("storage account connectionstring");
var client = account.CreateCloudBlobClient();
var container = client.GetContainerReference("container name");
var blob = container.GetAppendBlobReference("blob name");
在你的情况下,你想从一个文件追加:
await blob.AppendFromFileAsync("file path");
但您可以从文本、字节数组、流追加。检查文档。
我有一种将文件添加到 Azure Blob 存储的方法问题是我试图指定一个条件,在该条件下它不会覆盖 blob,而只是添加到它。我正在尝试使用参数访问条件,但是 VS 说此方法不能采用两个参数- async void archiveNewImportedImages(列出图像文件) {
// Saving the images
// Retrieve reference to a blob named "myblob".
// Create or overwrite the "myblob" blob with contents from a local file.
using (var fileStream = System.IO.File.OpenRead(@"C:\Users\rahulchawla\Desktop\FilezilleIMGS\FilezilleIMGS\MTO_Image\CR01-1-20170623-1327.jpg"))
{
await blockBlob.UploadFromStreamAsync(fileStream, accessCondition: AccessCondition.GenerateIfNoneMatchCondition("*"));
}
// save url of the image into a variable and later to the database
/// fileURL = blockBlob.Uri.ToString();
}
有什么建议吗?
最终目标:不要覆盖容器 - 继续添加不同的文件,例如。 img1.jpg、img2.jpg 到 blob
其他详细信息:想要将图像附加到容器(换句话说,继续将图像添加到容器)。如果文件存在,则不想覆盖现有文件)
根据设计,如果您尝试上传具有相同 blob 名称的新内容,Azure Blob 存储将覆盖 blob 的内容。
如果您不想覆盖内容,您可以做一些事情,但您将不得不为其编写代码。
- 在上传之前检查 blob 是否存在并使上传操作失败,并通知用户为 blob 选择另一个名称或在您的代码中指定一个新名称。您可以通过调用
blob.ExistsAsync
来检查 blob 是否存在,或者像您当前所做的那样使用访问条件执行操作。在第一种情况下,您将得到一个 true/false 值,并根据该值决定您想要做什么。在第二种情况下,上传操作将失败PreConditionNotMet (412 Status Code)
因此您需要捕获异常并决定要做什么。 - 如果您打算保留所有更改的历史记录,那么您应该查看 Azure Blob 存储中可用的
blob snapshot
功能。当您拍摄 blob 的快照时,它会创建 blob 的只读副本。但是请记住,在这种情况下,只有一个 blob 和许多快照。每个快照在拍摄快照时都由 date/time 唯一标识。您可以获取一个 blob 及其快照,以查看对该 blob 所做更改的历史记录。
现在有一个 CloudAppendBlob
class 允许您将内容添加到现有的 blob :
var account = CloudStorageAccount.Parse("storage account connectionstring");
var client = account.CreateCloudBlobClient();
var container = client.GetContainerReference("container name");
var blob = container.GetAppendBlobReference("blob name");
在你的情况下,你想从一个文件追加:
await blob.AppendFromFileAsync("file path");
但您可以从文本、字节数组、流追加。检查文档。