【问题标题】:Azure blob upload rename if blob name exist如果 blob 名称存在,Azure blob 上传重命名
【发布时间】:2019-08-09 22:35:52
【问题描述】:

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

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

场景:

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

【问题讨论】:

    标签: azure azure-storage azure-blob-storage


    【解决方案1】:

    您不能重命名 blob(没有适用于它的 API)。您的选择:

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

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

    【讨论】:

    • 另一张图片有不同的内容,而不是上下文 :) 我也在考虑检查是否存在,但你不会在那里遇到一个小小的竞争条件吗?跨度>
    • 噢噢噢噢。 :) 就竞争条件而言:OP 需要通过他们的应用程序来管理它(例如某种类型的队列管道)。而且,这种竞争条件在现实世界中的可能性是多少? (只有 OP 可以回答这个问题……)。相应地编辑了答案。
    【解决方案2】:

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

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

    当然,始终使用 GUID 可能更容易/更简洁,那么您不必担心。

    【讨论】:

      【解决方案3】:

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

      您可以通过使用

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

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

      【讨论】:

        猜你喜欢
        • 2020-03-14
        • 1970-01-01
        • 2014-04-10
        • 2014-08-06
        • 2021-10-13
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 2017-10-27
        相关资源
        最近更新 更多