如果存在blob名称,则Azure blob上载重命名

时间:2017-08-16 08:49:46

标签: azure azure-storage azure-storage-blobs

在Azure blob上传中,如果您上传具有相同文件名的新文件(在同一容器中),则会覆盖文件。

我想在保存之前重命名新文件,以避免覆盖任何文件 - 这可能吗?

情景:

  1. 将文件“Image.jpg”上传到容器“mycontainer”
  2. 将文件“Image.jpg”上传到容器“mycontainer”(内容不同)
  3. 将第二个“Image.png”重命名为“Image_ {guid} .jpg”,然后将其保存为“mycontainer”。

3 个答案:

答案 0 :(得分:0)

您无法重命名blob(它没有API)。你的选择:

  • 检查blob名称是否存在,在上传之前,如果名称已在使用中,则为您即将上传的blob选择其他名称
  • 通过将现有blob复制到不同名称的新blob来模拟重命名,然后删除原始blob

正如@juunas在评论中指出的那样:您必须管理您的工作流程,以避免在检查存在,重命名等方面存在潜在的竞争条件。

答案 1 :(得分:0)

我建议使用" If-None-Match:*"条件头(有时称为" If-Not-Exists"在客户端库中)。如果在PutBlob或PutBlockList操作中包含此标头,则调用将失败,并且不会覆盖数据。您可以捕获此客户端并重试上载操作(使用不同的blob名称。)

这比在上传之前检查blob是否存在有两个优点。首先,你不再有潜在的竞争条件。其次,调用Exists()会增加很多额外的开销 - 每次上传都需要额外的HTTP调用,这非常重要,除非你的blob非常大或延迟并不重要。使用访问条件时,您只需要在名称冲突时进行多次调用,这应该是一种罕见的情况。

当然,总是使用GUID可能更容易/更清洁,那么你不必担心它。

答案 2 :(得分:0)

需要重命名可能表明存在反模式。如果您的最终目标是在下载时更改文件名,则可以这样做,并保持Blob名称抽象且唯一。

您可以通过使用

分配ContentDisposition属性来设置http下载文件名
attachment;filename="yourfile.txt"

这将确保在以公共或SAS url访问Blob时设置了标头。