PutObjectCopy 接口请求创建一个已存在对象的副本,即将一个对象从源路径(对象键)复制到目标路径(对象键)。在复制过程中,可以通过
x-cos-metadata-directive 头部指定元数据的处理方式:默认情况下源对象的元数据会被复制到目标对象,也可以选择不复制源对象的元数据信息,而是使用本次请求中指定的新元数据。注意事项
单对象大小限制
PutObjectCopy 接口最大支持复制 5 GiB 的对象,源对象大小超过 5 GiB 时返回
EntityTooLarge。如需复制大于 5 GiB 的对象,请使用 分块上传 系列 API 接口。仅支持同桶拷贝
源对象与目标对象必须位于同一存储桶。当
x-cos-copy-source 中解析出的源存储桶名与请求 Host 中的存储桶名不一致时,请求返回 InvalidCopySource。源对象与目标对象均需为文件对象
本接口只支持复制文件对象,不支持目录对象。
x-cos-copy-source 中的源对象键末尾为 / 时,请求返回 400 InvalidCopySource;目标对象键末尾为 / 时,请求返回 400 InvalidArgument。目标对象所在目录无需预先创建
若目标对象键中包含多级路径(例如
a/b/c.txt),当路径中的目录对象(a/、a/b/)尚未创建时,服务会自动补齐,调用方无需先调用 PutObject 建立目录对象。若路径中的某一层已存在同名的文件对象(例如目标对象键为
a/b/c.txt,但 a/b 已作为文件对象存在),则无法在其下创建对象,返回 409 FileAlreadyExists。请求
请求语法
PUT /<ObjectKey> HTTP/1.1Host: <BucketName-APPID>.cosrapid.<Region>.myqcloud.comDate: <GMT Date>x-cos-copy-source: <BucketName-APPID>.cosrapid.<Region>.myqcloud.com/<SourceObjectKey>Content-Length: 0Authorization: <Auth String>
说明:
请求参数
此接口无请求参数。
请求头部
Header 名称 | 描述 | 类型 | 是否必选 |
x-cos-copy-source | 源对象的 URL,格式为 <BucketName-APPID>.cosrapid.<Region>.myqcloud.com/<SourceObjectKey>,其中对象键需经过 URL encode。源存储桶必须与目标存储桶相同,否则返回 InvalidCopySource | string | 是 |
x-cos-metadata-directive | 目标对象元数据的处理方式,枚举值 Copy、Replaced,默认为 Copy。取值为 Copy 时复制源对象的元数据,本次请求中携带的元数据头部会被忽略;取值为 Replaced 时使用本次请求头部中的元数据作为目标对象的元数据。取其他值时返回 InvalidArgument | enum | 否 |
x-cos-storage-class | 目标对象的存储类型,当前仅支持 RAPID(默认值)。指定其他取值时返回 NotSupportedStorageClass | enum | 否 |
x-cos-forbid-overwrite | 是否禁止覆盖同名对象,取值为 true 时启用;目标对象已存在则返回 409 FileAlreadyExists | string | 否 |
目标对象元数据相关头部
下列头部用于设置目标对象的元数据信息,仅在
x-cos-metadata-directive 指定为 Replaced 时生效;当指定为 Copy 或不指定时,下列头部会被忽略,目标对象保留源对象的元数据。Header 名称 | 描述 | 类型 | 是否必选 |
Cache-Control | RFC 2616 中定义的缓存指令,将作为目标对象元数据保存 | string | 否 |
Content-Disposition | RFC 2616 中定义的文件名称,将作为目标对象元数据保存 | string | 否 |
Content-Encoding | RFC 2616 中定义的编码格式,将作为目标对象元数据保存 | string | 否 |
Content-Language | RFC 2616 中定义的内容语言,将作为目标对象元数据保存 | string | 否 |
Content-Type | RFC 2616 中定义的 HTTP 请求内容类型(MIME),将作为目标对象元数据保存 | string | 否 |
Expires | RFC 2616 中定义的缓存失效时间,将作为目标对象元数据保存 | string | 否 |
x-cos-meta-[自定义后缀] | 用户自定义元数据头部,例如 x-cos-meta-test: test metadata。自定义后缀仅支持减号(-)、数字、英文小写字母(a~z),英文大写字母会被归一为小写 | string | 否 |
请求体
该请求的请求体为空。
响应
响应头部
响应体
响应体为 XML 格式:
<?xml version="1.0" encoding="UTF-8"?><CopyObjectResult><ETag>string</ETag><CRC64>string</CRC64><LastModified>string</LastModified></CopyObjectResult>
具体节点说明:
节点名称 | 父节点 | 描述 | 类型 |
CopyObjectResult | 无 | 保存 PutObjectCopy 结果的所有信息 | Container |
ETag | CopyObjectResult | 目标对象的 MD5 校验值,使用双引号包裹,例如 "ee8de918d05640145b18f70f4c3aa602" | string |
CRC64 | CopyObjectResult | 目标对象的 CRC64-ECMA 校验值,十进制字符串 | string |
LastModified | CopyObjectResult | 目标对象的最近修改时间,UTC 时区,ISO 8601 格式,秒精度,例如 2019-05-29T04:10:12Z | string |
错误码
实际案例
案例一:简单复制
请求
PUT /exampleobject HTTP/1.1Host: examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.comDate: Wed, 29 May 2019 04:10:12 GMTx-cos-copy-source: examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.com/sourceobjectContent-Length: 0Authorization: q-sign-algorithm=sha1&q-ak=AKIDXXXXXXXX&q-sign-time=1559074212;1559077812&q-key-time=1559074212;1559077812&q-header-list=content-length;date;host;x-cos-copy-source&q-url-param-list=&q-signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
响应
HTTP/1.1 200 OKContent-Type: application/xmlConnection: keep-aliveDate: Wed, 29 May 2019 04:10:12 GMTx-cos-request-id: NjUwMDAwMDAwMDAwMDAwMDAw<?xml version="1.0" encoding="UTF-8"?><CopyObjectResult><ETag>"ee8de918d05640145b18f70f4c3aa602"</ETag><CRC64>16749565679157681890</CRC64><LastModified>2019-05-29T04:10:12Z</LastModified></CopyObjectResult>
案例二:复制并替换元数据
本案例在复制对象的同时使用
x-cos-metadata-directive: Replaced 替换目标对象的元数据。请求
PUT /exampleobject HTTP/1.1Host: examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.comDate: Wed, 29 May 2019 04:10:12 GMTx-cos-metadata-directive: ReplacedContent-Type: application/octet-streamContent-Disposition: attachment; filename=example.jpgCache-Control: max-age=86400x-cos-copy-source: examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.com/sourceobjectContent-Length: 0Authorization: q-sign-algorithm=sha1&q-ak=AKIDXXXXXXXX&q-sign-time=1559074212;1559077812&q-key-time=1559074212;1559077812&q-header-list=cache-control;content-disposition;content-length;content-type;date;host;x-cos-copy-source;x-cos-metadata-directive&q-url-param-list=&q-signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
响应
HTTP/1.1 200 OKContent-Type: application/xmlConnection: keep-aliveDate: Wed, 29 May 2019 04:10:12 GMTx-cos-request-id: NjUwMDAwMDAwMDAwMDAwMDAw<?xml version="1.0" encoding="UTF-8"?><CopyObjectResult><ETag>"ee8de918d05640145b18f70f4c3aa602"</ETag><CRC64>16749565679157681890</CRC64><LastModified>2019-05-29T04:10:12Z</LastModified></CopyObjectResult>
案例三:原地修改对象元数据
通过将源对象与目标对象指定为同一对象,并指定
x-cos-metadata-directive: Replaced,可以仅更新对象的元数据,对象内容不变。请求
PUT /exampleobject HTTP/1.1Host: examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.comDate: Wed, 29 May 2019 04:10:12 GMTx-cos-metadata-directive: Replacedx-cos-meta-author: alicex-cos-copy-source: examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.com/exampleobjectContent-Length: 0Authorization: q-sign-algorithm=sha1&q-ak=AKIDXXXXXXXX&q-sign-time=1559074212;1559077812&q-key-time=1559074212;1559077812&q-header-list=content-length;date;host;x-cos-copy-source;x-cos-meta-author;x-cos-metadata-directive&q-url-param-list=&q-signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
响应
HTTP/1.1 200 OKContent-Type: application/xmlConnection: keep-aliveDate: Wed, 29 May 2019 04:10:12 GMTx-cos-request-id: NjUwMDAwMDAwMDAwMDAwMDAw<?xml version="1.0" encoding="UTF-8"?><CopyObjectResult><ETag>"ee8de918d05640145b18f70f4c3aa602"</ETag><CRC64>16749565679157681890</CRC64><LastModified>2019-05-29T04:10:12Z</LastModified></CopyObjectResult>
案例四:使用 x-cos-forbid-overwrite 防覆盖
本案例在复制对象请求中携带了
x-cos-forbid-overwrite: true,表示禁止覆盖同名对象。请求
PUT /exampleobject HTTP/1.1Host: examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.comDate: Wed, 29 May 2019 04:10:12 GMTx-cos-copy-source: examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.com/sourceobjectx-cos-forbid-overwrite: trueContent-Length: 0Authorization: q-sign-algorithm=sha1&q-ak=AKIDXXXXXXXX&q-sign-time=1559074212;1559077812&q-key-time=1559074212;1559077812&q-header-list=content-length;date;host;x-cos-copy-source;x-cos-forbid-overwrite&q-url-param-list=&q-signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
响应
如果目标对象不存在,则复制成功:
HTTP/1.1 200 OKContent-Type: application/xmlConnection: keep-aliveDate: Wed, 29 May 2019 04:10:12 GMTx-cos-request-id: NjUwMDAwMDAwMDAwMDAwMDAw<?xml version="1.0" encoding="UTF-8"?><CopyObjectResult><ETag>"ee8de918d05640145b18f70f4c3aa602"</ETag><CRC64>16749565679157681890</CRC64><LastModified>2019-05-29T04:10:12Z</LastModified></CopyObjectResult>
如果目标对象已存在,则返回报错:
HTTP/1.1 409 ConflictContent-Type: application/xmlDate: Wed, 29 May 2019 04:10:12 GMTx-cos-request-id: NjUwMDAwMDAwMDAwMDAwMDAw<?xml version='1.0' encoding='utf-8'?><Error><Code>FileAlreadyExists</Code><Message>File already exists.</Message><Resource></Resource><RequestId>NjUwMDAwMDAwMDAwMDAwMDAw</RequestId><TraceId></TraceId></Error>