覆盖 Blob 但保留元数据?
Overwrite Blob But Keep Metadata?
我需要在 blob(文件的本地路径)上存储信息并能够覆盖该 blob 但保留信息。
我尝试了元数据方法,它正是我一直在寻找的方法,但是一旦我覆盖了 blob,元数据也会被覆盖。
有什么方法可以覆盖 blob 但保留旧的元数据?
Updating an existing block blob overwrites any existing metadata on the blob
MSDN 声明有部分更新选项:
To perform a partial update of the content of a block blob, use the
Put Block List operation.
问题是如何设置部分更新以仅更新 blob 的数据而不更新元数据?
谢谢。
更新(更多信息):
我有一个云服务,它从客户端获取文件并return向客户端发送文件。
所以实际发生的是:
客户端向服务发送请求以生成在 blob 存储中存储一个 blob 的权限,服务 return 给他 URL+SAS ,我还创建了一个具有一个字符的实际 blob为了在 blob 上保存元数据。
客户端获取 URL+SAS 并开始使用 Web 客户端库上传文件。
一旦客户端上传了文件,他将使用提供给他的相同 URL 向服务器发送请求(并且 baisclly 告诉服务,这是我的文件做你的事)
服务器将操作文件并覆盖相同的 blob 和 return 整个操作的日志。
客户端可以读取日志并可以从同一个 URL 下载 "new" 文件。
你可能会注意到问题是我让客户端覆盖我的 blob,他(客户端)要求我上传文件,我 return 他 URL+SAS 但是当我生成了 SAS 令牌 我还创建了一个 blob 来保存元数据,直到用户上传到实际数据,所以我不能要求用户先获取元数据然后再上传(我需要上传来自 Webclient 库没有像 Azure 这样的特殊依赖 API).
总结
所以我的问题的答案的底线是 "No, there isn't a way to overwrite a blob and save the metadata",但是 Gaurav Mantri 对我的情况有一个很好的解决方法。
您可以使用获取的元数据调用 Get Blob Metadata to fetch the metadata of existing blob at first, and then call Put Block List,以便保留原始元数据。
这是您的问题的一种可能解决方案。当前,当您创建 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-*
请求 headers 传回。
我需要在 blob(文件的本地路径)上存储信息并能够覆盖该 blob 但保留信息。
我尝试了元数据方法,它正是我一直在寻找的方法,但是一旦我覆盖了 blob,元数据也会被覆盖。
有什么方法可以覆盖 blob 但保留旧的元数据?
Updating an existing block blob overwrites any existing metadata on the blob
MSDN 声明有部分更新选项:
To perform a partial update of the content of a block blob, use the Put Block List operation.
问题是如何设置部分更新以仅更新 blob 的数据而不更新元数据?
谢谢。
更新(更多信息):
我有一个云服务,它从客户端获取文件并return向客户端发送文件。
所以实际发生的是:
客户端向服务发送请求以生成在 blob 存储中存储一个 blob 的权限,服务 return 给他 URL+SAS ,我还创建了一个具有一个字符的实际 blob为了在 blob 上保存元数据。
客户端获取 URL+SAS 并开始使用 Web 客户端库上传文件。
一旦客户端上传了文件,他将使用提供给他的相同 URL 向服务器发送请求(并且 baisclly 告诉服务,这是我的文件做你的事)
服务器将操作文件并覆盖相同的 blob 和 return 整个操作的日志。
客户端可以读取日志并可以从同一个 URL 下载 "new" 文件。
你可能会注意到问题是我让客户端覆盖我的 blob,他(客户端)要求我上传文件,我 return 他 URL+SAS 但是当我生成了 SAS 令牌 我还创建了一个 blob 来保存元数据,直到用户上传到实际数据,所以我不能要求用户先获取元数据然后再上传(我需要上传来自 Webclient 库没有像 Azure 这样的特殊依赖 API).
总结
所以我的问题的答案的底线是 "No, there isn't a way to overwrite a blob and save the metadata",但是 Gaurav Mantri 对我的情况有一个很好的解决方法。
您可以使用获取的元数据调用 Get Blob Metadata to fetch the metadata of existing blob at first, and then call Put Block List,以便保留原始元数据。
这是您的问题的一种可能解决方案。当前,当您创建 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-*
请求 headers 传回。