Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure 覆盖Blob但保留元数据?_Azure_Metadata_Blob_Azure Storage Blobs - Fatal编程技术网

Azure 覆盖Blob但保留元数据?

Azure 覆盖Blob但保留元数据?,azure,metadata,blob,azure-storage-blobs,Azure,Metadata,Blob,Azure Storage Blobs,我需要在blob(文件的本地路径)上存储信息,并能够覆盖该blob,但保留信息 我尝试了元数据方法,这正是我一直在寻找的,但一旦我覆盖了blob,元数据也会被覆盖 有没有办法覆盖blob,但保留旧的元数据? 更新现有块blob将覆盖blob上的任何现有元数据 MSDN声明存在部分更新选项: 要对块blob的内容执行部分更新,请使用 放置阻止列表操作 问题是如何将部分更新设置为只更新blob的数据而不更新元数据 多谢各位 更新(进一步资料): 我有一个云服务,它从客户端获取一个文件,然后将一个

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

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

有没有办法覆盖blob,但保留旧的元数据? 更新现有块blob将覆盖blob上的任何现有元数据

MSDN声明存在部分更新选项:

要对块blob的内容执行部分更新,请使用 放置阻止列表操作

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

多谢各位

更新(进一步资料): 我有一个云服务,它从客户端获取一个文件,然后将一个文件返回给客户端

因此,实际发生的是:

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

客户端获取URL+SAS并开始使用web客户端库上载文件

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

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

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

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

总之
因此,我的问题的答案的底线是“不,没有办法覆盖blob并保存元数据”,但Gaurav Mantri有一个很好的解决方法来解决我的问题。

您可以先调用以获取现有blob的元数据,然后调用所获取的元数据,以便保留原始元数据。

以下是一个可能的解决方案。当前,当您创建SAS URL时,因为您的最终用户正在使用它具有
Write
权限。您要做的是修改您的SAS URL,以包括
Read
权限


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

我只是尝试了一段代码,其中我使用PutBlock和PutBlockList操作更新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 Block List。对于Block Blob,Put Blob REST API有一个大小限制:64MB。当您的文件超过64MB时,您必须调用Put Block和Put Block List。我认为这样做完全正确,但我关心的是Block Blob的Put Blob API的大小限制。我不认为size将是一个问题。客户端应用程序可以将文件分割成块,并利用Put Block和Put Block List REST API操作。:)但Ron说,使用WebClient从blob获取元数据可能太复杂,我认为通过WebClient调用Put Block和Put Block List也会同样复杂。我不这么认为:)。Get元数据、Put块和Put块列表都是简单的HTTP请求。复杂的地方在于将文件分割成块,然后上传这些块。但除此之外,这应该是一个相当直接的过程。Ron需要跟踪所有需要的HTTP头。因此,我的问题的答案的底线是“不,没有办法覆盖blob并保存元数据”,但这是一个很好的解决方法。