不要覆盖 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 的内容。

如果您不想覆盖内容,您可以做一些事情,但您将不得不为其编写代码。

  1. 在上传之前检查 blob 是否存在并使上传操作失败,并通知用户为 blob 选择另一个名称或在您的代码中指定一个新名称。您可以通过调用 blob.ExistsAsync 来检查 blob 是否存在,或者像您当前所做的那样使用访问条件执行操作。在第一种情况下,您将得到一个 true/false 值,并根据该值决定您想要做什么。在第二种情况下,上传操作将失败 PreConditionNotMet (412 Status Code) 因此您需要捕获异常并决定要做什么。
  2. 如果您打算保留所有更改的历史记录,那么您应该查看 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");

但您可以从文本、字节数组、流追加。检查文档。