【问题标题】:Overwrite Blob But Keep Metadata?覆盖 Blob 但保留元数据?
【发布时间】:2015-07-16 07:58:15
【问题描述】:

我需要在 blob(文件的本地路径)上存储信息,并且能够覆盖该 blob 但保留信息。

我尝试了元数据方法,它正是我所寻找的,但是一旦我覆盖了 blob,元数据也会被覆盖。

有什么方法可以覆盖 blob 但保留旧的元数据?

更新现有块 blob 会覆盖 blob 上的任何现有元数据

Reference

MSDN 声明有部分更新选项:

要对块 blob 的内容执行部分更新,请使用 Put Block List 操作。

Put Block List

问题是如何将部分更新设置为仅更新 blob 的数据而不更新元数据?

谢谢。

更新(更多信息):

我有一个从客户端获取文件并将文件返回给客户端的云服务。

所以实际发生的是:

客户端向服务发送请求以生成在 blob 存储中存储一个 blob 的访问权限,服务返回给他 URL+SAS ,我还创建了一个具有一个字符的实际 blob,以便将元数据保存在 blob 上。

客户端获取 URL+SAS 并开始使用 Web 客户端库上传文件。

一旦客户端上传了文件,他将使用提供给他的相同 URL 向服务器发送请求(并且基本上告诉服务,这是我的文件做你的事情)

服务器将操作文件并覆盖相同的 blob 并返回整个操作的日志。

客户端可以读取日志并可以从同一 URL 下载“新”文件。

您可能注意到问题是我让客户端覆盖了我的 blob,他(客户端)要求我上传文件,我返回给他 URL+SAS 但是当我生成 SAS 令牌时,我还创建了一个位blob 保存元数据,直到用户上传到实际数据,所以我不能要求用户先获取元数据然后上传(我需要上传来自 Webclient 库,没有像 Azure API 这样的特殊依赖)。

总结

所以我的问题的答案的底线是“不,没有办法覆盖 blob 并保存元数据”,但 Gaurav Mantri 对我的情况有一个很好的解决方法。

【问题讨论】:

    标签: azure metadata blob azure-blob-storage


    【解决方案1】:

    这是解决您的问题的一种可能方法。当前,当您创建 SAS URL 时,由于您的最终用户正在使用它上传文件,因此它具有 Write 权限。您所做的是修改您的 SAS URL 以包含 Read 权限。

    在客户端应用程序上,收到 SAS URL 后,您首先要做的是使用 Get Blob Metadata REST API 操作读取 blob 的元数据。你不需要为此目的使用 Azure SDK。您将执行 Head 请求,并且您的请求 URL 将是 https://[account].blob.core.windows.net/[container]/[blob]?sastoken&comp=metadata,仅使用 WebClient。获取元数据后,您可以在用户上传文件时将其作为 x-ms-meta-* 请求标头传回。

    【讨论】:

    • 我认为这正是这样做的正确方法,但我关心的是块 blob 的 Put Blob API 的大小限制。
    • 我不认为尺寸是一个问题。客户端应用程序可以将文件分割成块,并利用 Put Block 和 Put Block List REST API 操作。
    • :) 但是 Ron 说使用 WebClient 从 blob 中获取元数据可能太复杂了,我认为通过 WebClient 调用 Put Block 和 Put Block List 也会同样复杂。
    • 我不这么认为:)。 Get Metadata、Put Block 和 Put Block list 是简单的 HTTP 请求。复杂性出现的地方是将文件分成块,然后上传这些块。但除此之外,这应该是一个相当直接的过程。 Ron 需要跟踪所有必需的 HTTP 标头。
    • 所以我的问题的答案的底线是“不,没有办法覆盖 blob 并保存元数据”,但这是一个很好的解决方法。
    【解决方案2】:

    您可以先调用Get Blob Metadata获取现有blob的元数据,然后使用获取的元数据调用Put Block List,以便保留原始元数据。

    【讨论】:

    • 我刚刚尝试了一小段代码,其中我使用 PutBlock 和 PutBlockList 操作更新了一个 blob,如果我在更新过程中没有指定元数据,它将从原始 blob 中清除。跨度>
    • 我在此处以及原始问题中写下了我的回复(为了便于阅读)。问题是我让客户端覆盖了我的 blob,他(客户端)要求我上传文件,我将 URL+SAS 返回给他,但是当我生成 SAS 令牌时,我还创建了一个位 blob 来保存元数据,直到用户上传到实际数据,所以我不能要求用户先获取元数据然后上传(我需要上传来自 webclient,没有像 Azure API 这样的特殊依赖)。
    • 在不覆盖元数据的情况下无法调用 Put Block List。我只是对客户端在调用 Put Block List 之前无法获取元数据的原因感到好奇。如果 webclient 没有像 Azure API 这样的特殊依赖,它如何将数据上传到 blob?
    • @Zossin 我更新了我的原始问题,提供了有关我的服务设计的更多详细信息。也许有一种方法可以使用 WebClient 从 blob 中获取元数据(必须有一种方法),但它会很复杂。
    • 你可以参考 Gaurav 的回答,但我还有一点要指出:通过调用 WebClient.UploadData(),你实际上是在调用 Put Blob 而不是调用 Put Block List。对于 Block Blob,Put Blob REST API 有大小限制:64MB。当您的文件超过 64MB 时,您必须调用 Put Block 和 Put Block List。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2021-12-14
    相关资源
    最近更新 更多