销售电话: 1-800-867-1380

复制 Blob

更新时间: 2013年11月

Copy Blob 操作在存储帐户中将 Blob 复制到目标位置。在版本 2012-02-12 和更新版本中,Copy Blob 操作的源可以是任何 Azure 存储帐户中已提交的 Blob。

note备注
只有创建于 2012 年 6 月 7 日或之后的存储帐户才允许Copy Blob 操作从其他存储帐户中进行复制。

可以按如下方式构建Copy Blob请求。建议使用 HTTPS。将 myaccount 替换为你的存储帐户名称,将 mycontainer 替换为你的容器名称,并将 myblob 替换为你的目标 Blob 的名称。从版本 2013-08-15 开始,你可以为目标位置 Blob 指定共享访问签名。

 

  PUT 方法请求 URI HTTP 版本

https://myaccount.blob.core.windows.net/mycontainer/myblob

HTTP/1.1

在针对模拟的存储服务发出请求时,请将模拟器主机名和 BLOB 服务端口指定为 127.0.0.1:10000,后跟模拟的存储帐户名称:

 

  PUT 方法请求 URI HTTP 版本

http://127.0.0.1:10000/devstoreaccount1/mycontainer/myblob

HTTP/1.1

有关详细信息,请参阅使用 Azure 存储模拟器进行开发和测试

可以在请求 URI 上指定以下附加参数。

 

Parameter 说明

timeout

可选。timeout 参数以秒表示。有关详细信息,请参阅为 BLOB 服务操作设置超时

下表介绍必需的和可选的请求标头。

 

请求标头 说明

Authorization

必需。指定身份验证方案、帐户名和签名。有关详细信息,请参阅Azure 存储服务身份验证

Datex-ms-date

必需。为请求指定协调世界时 (UTC)。有关详细信息,请参阅Azure 存储服务身份验证

x-ms-version

对于所有验证的请求是必需的。有关详细信息,请参阅Azure 存储服务版本化

x-ms-meta-name:value

可选。指定与 Blob 关联的用户定义的名称-值对。如果没有指定名称-值对,该操作会将源 Blob 元数据复制到目标 Blob。如果指定多个名称-值对,则使用指定元数据创建目标 Blob,并且不从源 Blob 复制元数据。

请注意,从 2009-09-19 版开始,元数据名称必须遵循 C# 标识符的命名规则。 有关更多信息,请参见命名和引用容器、Blob 和元数据

x-ms-source-if-modified-since

可选。一个 DateTime 值。如果指定此条件头,则仅当源 Blob 自指定日期/时间后发生了修改时才复制 Blob。如果源 Blob 未修改,BLOB 服务将返回状态代码 412(不满足前提条件)。

x-ms-source-if-unmodified-since

可选。一个 DateTime 值。如果指定此条件头,则仅当源 Blob 自指定日期/时间后未修改时才复制 Blob。如果源 Blob 已修改,BLOB 服务将返回状态代码 412(不满足前提条件)。

x-ms-source-if-match

可选。ETag 值。如果指定此条件头,则仅当源 Blob 的 ETag 与指定的值匹配时才复制源 Blob。如果 ETag 值不匹配,BLOB 服务将返回状态代码 412(不满足前提条件)。

x-ms-source-if-none-match

可选。ETag 值。如果指定此条件头,则仅当 Blob 的 ETag 与指定的值不匹配时才复制 Blob。如果值相同,BLOB 服务将返回状态代码 412(不满足前提条件)。

If-Modified-Since

可选。一个 DateTime 值。如果指定此条件头,则仅当目标 Blob 自指定日期/时间后发生了修改时才复制 Blob。如果目标 Blob 未修改,BLOB 服务将返回状态代码 412(不满足前提条件)。

If-Unmodified-Since

可选。一个 DateTime 值。如果指定此条件头,则仅当目标 Blob 自指定日期/时间后未修改时才复制 Blob。如果目标 Blob 已修改,BLOB 服务将返回状态代码 412(不满足前提条件)。

If-Match

可选。ETag 值。如果为此条件头指定一个 ETag 值,则仅当指定的 ETag 值与现有目标 Blob 的 ETag 值匹配时才复制 Blob。如果目标 Blob 的 ETag 与为 If-Match 指定的 ETag 不匹配,BLOB 服务将返回状态代码 412(不满足前提条件)。

If-None-Match

可选。ETag 值或通配符 (*)。

如果为此条件头指定一个 ETag 值,则仅当指定的 ETag 值与目标 Blob 的 ETag 值不匹配时才复制 Blob。

指定通配符 (*),仅当目标 Blob 不存在时才执行此操作。

如果不满足指定的条件,BLOB 服务将返回状态代码 412(不满足前提条件)。

x-ms-copy-source:name

必需。指定源的 Blob 的名称。

在版本 2012-02-12 和更新版本中,此值为一个长达 2 KB 的指定 Blob 的 URL。同一帐户中的源 Blob 可以是私有的,但其他帐户中的 Blob 必须是公共的或接受此 URL 中包含的凭据,例如共享访问签名。只有创建于 2012 年 6 月 7 日或之后的存储帐户才允许Copy Blob 操作从其他存储帐户中进行复制。Microsoft 建议尽可能使用 HTTPS。示例:

  • https://myaccount.blob.core.windows.net/mycontainer/myblob

  • https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=<DateTime>

在 2012-02-12 之前的版本中,只能在同一帐户中复制 Blob,源名称可以使用以下格式:

  • 命名容器中的 Blob:/accountName/containerName/blobName

  • 命名容器中的快照:/accountName/containerName/blobName?snapshot=<DateTime>

  • 根容器中的 Blob: /accountName/blobName

  • Snapshot in root container:/accountName/blobName?snapshot=<DateTime>

x-ms-lease-id:<ID>

如果目标 Blob 有活动租约,则是必需的。此标头的租约 ID 必须与目标 Blob 的租约 ID 匹配。如果请求中不包含租约 ID 或租约 ID 无效,则操作将失败,且显示状态码 412(不满足前提条件)。

如果指定此标头并且目标 Blob 没有活动租约,操作也将失败,且显示状态代码 412(不满足前提条件)。

在版本 2012-02-12 和更新版本中,此值为必须为租用的 Blob 指定一个活动的无限期租约。有限期租约 ID 会失败,并显示 412(不满足前提条件)。

x-ms-source-lease-id: <ID>

可选,2012-02-12 之前的版本(2012-02-12 和更新版本中不支持)。如果指定此标头,则仅当给定的租约 ID 与源 Blob 的活动租约 ID 匹配时才执行Copy Blob 操作。

如果指定此标头并且源 Blob 没有活动租约,操作也将失败,且显示状态代码 412(不满足前提条件)。

x-ms-client-request-id

可选。提供客户端生成的、附带 1 KB 字符限制的不透明值,在启用存储分析日志记录时,将在分析日志中记录该值。强烈建议使用此标头将客户端活动与服务器接收的请求相关联。有关详细信息,请参阅 关于存储分析日志记录Azure 日志记录:使用日志跟踪存储请求

无。

响应包括 HTTP 状态代码和一组响应标头。

在版本 2012-02-12 和更新版本中,成功地操作将返回状态代码 202(已接受)。

在 2012-02-12 之前的版本中,成功地操作将返回状态代码 201(已创建)。

有关状态代码的信息,请参阅状态和错误代码

此操作的响应包括以下标头。该响应还可能包括其他标准 HTTP 标头。所有标准标头都符合 HTTP/1.1 协议规范

 

响应标头 说明

ETag

在版本 2012-02-12 和更新版本中,如果复制完成,将包含目标 Blob 的 ETag。如果复制未完成,将包含复制开始时创建的空 Blob 的 ETag。

在 2012-02-12 之前的版本中,将返回目标 Blob 的 ETag。

在版本 2011-08-18 和更新版本中,ETag 值将用引号引起来。

Last-Modified

返回到目标 Blob 的复制操作的完成日期/时间。

x-ms-request-id

此标头唯一地标识发出的请求,并且可用于解决请求问题。有关详细信息,请参阅API 操作故障排除

x-ms-version

指示用于执行请求的 BLOB 服务的版本。针对 2009-09-19 和更高版本发出的请求将返回此标头。

Date

服务生成的 UTC 日期/时间值指示启动响应的时间。

x-ms-copy-id: <id>

2012-02-12 和更高版本。此复制操作的字符串标识符。与Get BlobGet Blob Properties一起使用可检查此复制操作的状态,或传递给Abort Copy Blob 可中止挂起的复制。

x-ms-copy-status: <success | pending>

2012-02-12 和更高版本。复制操作的状态值如下:

  • success:复制已成功完成。

  • pending:正在进行复制。

无。

下面是 Blob 复制请求的示例响应:

Response Status:
HTTP/1.1 202 Accepted

Response Headers: 
Last-Modified: Thu, 09 Feb 2012 23:30:19 GMT 
ETag: "0x8CEB669D794AFE2"
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: cc6b209a-b593-4be1-a38a-dde7c106f402
x-ms-version: 2012-02-12
x-ms-copy-id: 1f812371-a41d-49e6-b123-f4b542e851c5
x-ms-copy-status: pending
Date: Thu, 09 Feb 2012 23:30:18 GMT

帐户所有者可以调用此操作。对于针对版本 2013-08-15 和更高版本提交的请求,支持对同一帐户内的复制操作使用有权写入目标位置 Blob 或其容器的共享访问签名。请注意,在请求中指定的共享访问签名只适用于目标位置 Blob。对源 Blob 的访问分别授权,如请求标头 x-ms-copy-source 的详细信息中所述。

在版本 2012-02-12 和更新版本中,Copy Blob 操作可以异步完成。此操作返回一个复制 ID,可以用来检查或中止复制操作。BLOB 服务尽量复制 Blob。

复制操作的源 Blob 可以是块 Blob、页 Blob 或这二者的快照。如果目标 Blob 已存在,它的 Blob 类型必须与源 Blob 相同。将覆盖任何现有目标 Blob。复制操作进行时不能修改目标 Blob。

帐户中的多个挂起的Copy Blob 操作可以按顺序处理。目标 Blob 只能有一个未完成的复制 Blob 操作。也就是说,Blob 不能是多个挂起的Copy Blob 操作的目标。如果尝试对已有挂起的复制操作的目标 Blob 进行Copy Blob,则会失败并显示状态代码 409(冲突)。

只有创建于 2012 年 6 月 7 日或之后的存储帐户才允许Copy Blob 操作从其他存储帐户中进行复制。尝试从另一存储帐户向 2012 年 6 月 7 日前创建的帐户进行复制会失败并显示状态代码 400(错误请求)。

Copy Blob 操作始终复制整个源 Blob;不支持复制字节范围或块组。

Copy Blob 操作可以采用以下任意形式:

  • 可以将源 Blob 复制到名称不同的目标 Blob。目标 Blob 可以是相同 Blob 类型(块或页)的现有 Blob,也可以是复制操作创建的新 Blob。

  • 可以将源 Blob 复制到同名目标 Blob,有效地替换源 Blob。这类复制操作会删除所有未提交的块并覆盖 Blob 的元数据。

  • 可以将快照复制到其基本 Blob 上。通过将快照提升到基本 Blob 的位置,可还原早期版本的 Blob。

  • 你可将快照复制到具有不同名称的目标 Blob。生成的目标 Blob 是可编写的 Blob,而不是快照。

从页 Blob 复制时,BLOB 服务创建一个源 Blob 长度的目标页 Blob,初始内容全部为零。然后枚举页面范围,复制非空范围。从块 Blob 复制时,将复制所有已提交的块及其块 ID。未提交的块将不复制。对于块 Blob,在从此操作返回前,BLOB 服务会创建一个零长度的已提交 Blob。对于每种 Blob 类型,都可以对目标 Blob 调用Get BlobGet Blob Properties来检查复制操作的状态。复制完成时,将提交最终的 Blob。

当复制操作源提供 ETag 时,如果复制进行时源有任何更改,复制将失败。复制进行时尝试更改目标 Blob 会失败并显示 409 冲突。如果目标 Blob 有无限期租约,必须将租约 ID 传递给Copy Blob。不允许使用有限期租约。

Copy Blob 操作开始时和复制完成时,块 Blob 的 ETag 会发生更改。Copy Blob 操作开始时,页 Blob 的 ETag 会发生更改,并且在复制期间继续频繁更改。块 Blob 的内容只能在整个复制完成后使用 GET 查看。

复制 Blob 属性和元数据

复制 Blob 时,会将以下系统属性复制到具有相同值的目标 Blob:

  • Content-Type

  • Content-Encoding

  • Content-Language

  • Content-Length

  • Cache-Control

  • Content-MD5

  • Content-Disposition

  • x-ms-blob-sequence-number (for page blobs only)

如果源 Blob 是块 Blob,则其块列表也会复制到目标 Blob。不会复制任何未提交的块。

目标 Blob 的大小始终与源 Blob 相同,因此目标 Blob 的 Content-Length 标头值与源目标的匹配。

当源 Blob 与目标 Blob 相同时,Copy Blob 会删除所有未提交的块。如果这种情况下指定元数据,将用新的元数据覆盖现有元数据。

复制已租用 Blob

Copy Blob 操作只是读取源 Blob,因此源 Blob 的租约状态并不重要。但是,Copy Blob 操作在复制开始时会保存源 Blob 的 ETag。如果复制完成前 ETag 值发生了更改,复制会失败。不能通过在复制操作期间租用源 Blob 来阻止其更改。

如果目标 Blob 有活动的无限期租约,必须在对Copy Blob 操作的调用中指定其租约 ID。如果指定的租约是活动的有限期租约,操作将失败,并显示状态码 412(不满足前提条件)。复制挂起时,对目标 Blob 的所有租用操作都会失败并显示状态代码 409(冲突)。在复制操作期间,无论是从源复制到名称不同的目标 Blob,复制到与源同名的目标 Blob,还是在其基本 Blob 上提升快照,目标 Blob 的无限期租约都以这种方式锁定。如果客户端对 Blob 指定的租约 ID 尚不存在,Blob 服务将对针对版本 2013-08-15 和更高版本提交的请求返回状态代码 412(不满足前提条件);对于以前的版本,Blob 服务将返回状态代码 201(已创建)。

复制快照

复制源 Blob 时,不会将该源 Blob 的任何快照复制到目标。使用副本覆盖目标 Blob 时,与该目标 Blob 关联的所有快照都根据其名称保持不变。

可以执行复制操作来在其基本 Blob 上提升快照。通过这种方式可以还原早期版本的 Blob。快照会保留,但会使用可读写的副本覆盖其目标。

使用挂起的复制(版本 2012-02-12 和更新版本)

Copy Blob 以异步方式完成复制。使用下表可根据Copy Blob 返回的状态确定下一步骤:

 

状态代码 含义

202(已接受),x-ms-copy-status:成功

复制已成功完成。

202(已接受),x-ms-copy-status:挂起

500 或 503

复制尚未完成。在复制完成或失败前,可以使用Get Blob Properties轮询目标 Blob 检查 x-ms-copy-status。

4xx、500 或 503

复制失败。

Copy Blob 操作期间或之后,目标 Blob 的属性包含Copy Blob 操作的副本 ID 和源 Blob 的 URL。复制完成时,BLOB 服务会将时间和结果值(successfailedaborted)写入目标 Blob 属性。如果操作 failedx-ms-copy-status-description 标头会包含一个错误详细信息字符串。

挂起的Copy Blob 操作有 2 周超时时间。2 周时间后尚未完成的复制尝试将超时并留下一个 x-ms-copy-status 字段设置为 failedx-ms-copy-status-description 设置为 500 (OperationCancelled) 的空 Blob。复制期间突然发生的非严重错误可能影响复制进度,但不会导致复制失败。这种情况下,x-ms-copy-status-description 说明间发错误。

复制期间对目标 Blob 的任何尝试或快照修改都会失败,并显示 409(冲突)正在复制 Blob

如果调用Abort Copy Blob 操作,可以看到 x-ms-copy-status:aborted 标头,目标 Blob 的元数据保持不变,Blob 长度为零字节。可以重复对Copy Blob 的原始调用再次尝试复制。

计费

启动复制将按一个事务对Copy Blob 操作的目标帐户收费,中止或请求复制操作状态的每个请求也会产生一个事务的收费。

当源 Blob 在其他帐户中时,源帐户将产生事务成本。此外,如果源和目标帐户位于不同区域(例如美国北部和美国南部),传出时会就用于传输请求的带宽对源存储帐户收费。同一区域中帐户间的传出免费。

将源 Blob 复制到同一帐户中名称不同的目标 Blob 时,对新 Blob 使用了其他存储帐户,因此复制操作会针对这些其他资源对该存储帐户的容量使用收费。但是,如果同一帐户中的源和目标 Blob 的名称相同(例如,将快照提升到其基本 Blob 时),除了额外复制版本 2012-02-12 和更新版本中存储的数据,不会产生其他费用。

提升快照以替换其基本 Blob 时,快照和基本 Blob 会变得相同。它们共享块或页,因此复制操作不会对存储帐户的容量使用产生其他费用。但是,如果将快照复制到名称不同的目标 Blob,所生成的新 Blob 使用的存储资源会产生额外的费用。两个名称不同的 Blob 即使相同,也不能共享块或页。有关快照成本方案的详细信息,请参阅了解快照如何产生费用

本文是否对您有所帮助?
(1500 个剩余字符)
感谢您的反馈
显示:
© 2014 Microsoft