什么是软链接
软链接(Symlink)类似于快捷方式。在同一个存储桶内,对于一个对象,仅需要存储一份真实数据(Target Object,源文件),在存储桶其余位置可以创建该对象的软链接,用户可以通过软链接访问对象。
实际上,软链接是一种特殊的 Standard 类型的对象。软链接本身具有独立的名称、元数据、ACL,不必与源文件完全一致;但用户对软链接所执行的只读请求(包括下载对象 GET Object 和获取元数据 HEAD Object)将返回源文件的内容。
使用场景
软链接就像快捷方式一样,用于帮助用户快速访问经常使用的对象。设置软链接后,您可以通过软链接文件快速打开源文件。
通过软链接,您可以对源文件进行以下只读操作:
GET Object:通过软链接的对象键,下载源文件。
HEAD Object:通过软链接的对象键,获取源文件的元数据。
软链接的特性
基本特性
软链接和源文件(Target Object)必须位于同一个存储桶中。
软链接实际上是一个特殊的 Standard 类型的文件,文件内容就是源文件的存储路径,例如
/123/myphoto.jpeg,这里的存储路径不包括存储桶的部分。软链接的文件大小一般很小,主要由源文件真实存储路径的长度决定,和源文件的实际大小无关。
软链接拥有自己独立的元数据(例如 Content-Type、Etag、Last-Modified 等,其他参数可参见 对象元数据)。其中,
Content-Type 的默认值是根据真实对象的文件后缀生成的,若源文件不包含后缀,则默认是软链接的 Content-Type。
Etag 是软链接文件本身的 Etag,反映了软链接存储的源文件路径的MD5值。
Last-Modified 表示软链接的最后修改时间,与源文件的修改时间无关。
对象信息 | 描述 | 是否一定与真实对象一致 | 举例 |
文件内容(Object Content) | 源文件的存储路径,不包含存储桶路径的部分 | 否 | /123/myphoto.jpeg/ppp.txt |
文件大小(Size) | 软链接的大小,一般是一个很小的值,和源文件存储路径的长度有关,和源文件的大小无关 | 否 | 9B |
Etag | 软链接文件本身的 Etag,反映了软链接存储的源文件路径的 MD5值 | 是 | db5570bf61464b46e2bde31ed61a7dc6 |
Content-Type | 此项的默认值是根据源文件的文件名后缀生成的 | 否 | image/jpeg |
Last-Modified | 软链接的最后修改时间,独立于真实对象 | 否 | 2021-08-20 133017 |
ACL | 需要为软链接单独设置权限,独立于源文件。 注意: 软链接拥有自己独立的 ACL,通过软链接下载文件,会经过2次鉴权,一次是软链接鉴权,一次是源文件鉴权,任意一次鉴权不通过,都会拒绝请求。 | 否 | private |
标签 | 需要为软链接单独设置标签,独立于源文件 | 否 | symlinktag:value1 |
versionid | 软链接支持版本控制,独立于源文件 | 否 | MTg0NDUxMTU4NDEzOTgwNjU5MTk |
CRC64 | 软链接不需要 CRC64,如果用户需要计算,实际计算的是软链接文件的 CRC64 | 否 | - |
版本控制
未开启版本控制时,当软链接和普通文件重名,或软链接和软链接重名时,会进行覆盖。
开启版本控制后,创建重名软链接或上传重名对象时,会增加一个新的版本。
生命周期
当您为源文件配置生命周期沉降/删除时,软链接不会被同时沉降/删除。
当您为软链接配置生命周期删除时,COS 会根据软链接的最后上传时间(Last-Modified)进行删除,只会删除软链接文件本身,而不会删除源文件。
对象权限
使用软链接下载文件时,需要保证用户同时具有软链接和源文件的使用权限。这是因为,当用户发起通过软链接下载文件的请求时,会经过2次鉴权,一次是软链接鉴权,一次是源文件鉴权,任意一次鉴权不通过,都会拒绝请求。
对象复制
清单
日志
软链接具有单独的日志记录,这个日志只保存作用于软链接的访问记录,直接作用于源文件的请求不会被记录。
使用方法
创建软链接(PUT Symlink)
您可以通过 PUT Symlink 接口创建与源文件位于同一存储桶的软链接。
发送请求时,必须携带 x-cos-symlink-target 头部标明源文件的存储路径。
软链接只能为标准存储类型,创建软链接时,x-cos-storage-class 只支持填写标准类型和标准类型(多 AZ)。默认情况下,存储为标准类型。
创建软链接时源文件路径只能是当前版本,不支持携带版本号。
创建软链接时,不检查源文件是否存在、以及访问权限的情况,只会根据您的请求将目标文件的路径保存到软链接文件的元数据;因此,您也可以对软链接本身再创建软链接。
当源文件路径不存在、无法访问、或实际为一个软链接时,通过软链接对象键发起的 GET Object 和 HEAD Object 请求会报错。
请求
请求示例
PUT /SymlinkName?symlink HTTP/1.1Host: <BucketName-APPID>.cos.<Region>.myqcloud.comDate: GMT DateAuthorization: Auth Stringx-cos-symlink-target: TargetObjectName
请求参数
此接口无请求参数。
请求头
名称 | 描述 | 类型 | 是否必选 |
x-cos-symlink-target | 真实对象的存储路径 | string | 是 |
请求体
此接口无请求体。
响应
响应头
名称 | 描述 | 类型 |
x-cos-storage-class | 对象存储类型,由于软链接只能存储为 STANDARD(或者 MAZ_STANDARD),只会返回 STANDARD(或者 MAZ_STANDARD) | string |
响应体
此接口无响应体。
响应示例
HTTP/1.1 200 OKContent-Length: 0Connection: keep-aliveDate: Fri, 10 Apr 2020 09:35:05 GMTETag: "ee8de918d05640145b18f70f4c3aa602"Server: tencent-cosx-cos-request-id: NWU5MDNkYzlfNjRiODJhMDlfMzFmYzhfMTFm****x-cos-storage-class: STANDARD
获取软链接本身(GET Symlink)
您可以通过 GET Symlink 接口获取软链接文件本身。
请求
不带版本号的请求
GET /SymlinkName?symlink HTTP/1.1Host: <BucketName-APPID>.cos.<Region>.myqcloud.comDate: GMT DateAuthorization: Auth String
带版本号的请求
GET /SymlinkName?symlink&versionId=CADSGRWGSDV******* HTTP/1.1Host: <BucketName-APPID>.cos.<Region>.myqcloud.comDate: GMT DateAuthorization: Auth String
请求参数
此接口无请求参数。
请求头
请求体
此接口无请求体。
响应
响应头
名称 | 描述 | 类型 |
x-cos-symlink-target | Target Object 的存储路径 | string |
响应体
此接口响应体为空。
响应示例
HTTP/1.1 200 OKContent-Type: application/xmlContent-Length: 0Connection: keep-aliveDate: Fri, 10 Apr 2020 09:35:05 GMTLast-Modified: Fri, 24 Feb 2012 06:07:48 GMTETag: "ee8de918d05640145b18f70f4c3aa602"Server: tencent-cosx-cos-hash-crc64ecma: 16749565679157681890x-cos-request-id: NWU5MDNkYzlfNjRiODJhMDlfMzFmYzhfMTFm****x-cos-symlink-target: TargetObjectName
删除软链接(DELETE Object)
当您调用 DELETE Object 接口,对象键是软链接时,删除的是软链接本身,不会删除源文件。
请求
请求参数
此接口无请求参数。
请求头
请求体
此接口无请求体。
请求示例
DELETE /SymlinkName HTTP/1.1Host: <BucketName-APPID>.cos.<Region>.myqcloud.comDate: GMT DateAuthorization: Auth String
响应
响应头
响应体
此接口无响应体。
响应示例
HTTP/1.1 204 No ContentConnection: keep-aliveDate: Wed, 08 Sep 2021 07:01:43 GMTServer: tencent-cosx-cos-request-id: NjEzODVmZDdfMzBkMDM4MGJfMTRlMjJfMThj****
通过软链接下载真实对象(GET Object)
可以通过 GET Object 接口,通过软链接下载真实对象。
请求
请求参数
此接口无请求参数。
请求头
请求体
此接口无请求体。
请求示例
GET /SymlinkName HTTP/1.1Host: <BucketName-APPID>.cos.<Region>.myqcloud.comDate: GMT DateAuthorization: Auth String
响应
响应头
响应体
此接口请求的响应体为对象(文件)内容。
响应示例
HTTP/1.1 200 OKContent-Type: application/x-tarContent-Length: 6Connection: keep-aliveAccept-Ranges: bytesDate: Wed, 08 Sep 2021 03:18:52 GMTETag: "4a1dbd5124d2ff06740c55ea3ec89f22"Last-Modified: Wed, 08 Sep 2021 03:17:13 GMTServer: tencent-cosx-cos-hash-crc64ecma: 4071074640841670626x-cos-request-id: NjEzODJiOWNfNWJiODJhMDlfMTJmMGFfMTRhZGZ****
通过软链接获取源文件的元数据(HEAD Object)
可以通过 HEAD Object 接口,指定对象键为软链接文件名,获取源文件的元数据。
请求
请求示例
HEAD /SymlinkName HTTP/1.1Host: <BucketName-APPID>.cos.<Region>.myqcloud.comDate: GMT DateAuthorization: Auth String
请求参数
此接口无请求参数。
请求头
请求体
此接口无请求体。
响应
响应头
响应体
该请求无响应体。
响应示例
HTTP/1.1 200 OKContent-Type: application/octet-streamContent-Length: 6Connection: keep-aliveDate: Wed, 08 Sep 2021 03:19:22 GMTETag: "4a1dbd5124d2ff06740c55ea3ec89f22"Last-Modified: Wed, 08 Sep 2021 03:17:13 GMTServer: tencent-cosx-cos-hash-crc64ecma: 4071074640841670626x-cos-request-id: NjEzODJiYmFfNTJiNzJhMDlfMmM5MjhfMTUwZ****
实际案例
软链接文件名:sym
源文件对象名:tar
存储桶:examplebucket-1250000000.cos.ap-beijing.myqcloud.com
示例一:创建软链接(PUT Symlink)
请求
PUT /sym?symlink= HTTP/1.1Host: examplebucket.cos.ap-beijing.myqcloud.comx-cos-symlink-target: tarAuthorization: q-sign-algorithm=sha1&q-ak=************************************&q-sign-time=1631070976;1632071026&q-key-time=1631070976;1632071026&q-url-param-list=symlink&q-header-list=host;x-cos-symlink-target&q-signature=****************************************
响应
HTTP/1.1 200 OKContent-Length: 0Connection: keep-aliveDate: Wed, 08 Sep 2021 06:27:36 GMTETag: "d41d8cd98f00b204e9800998ecf8427e"Server: tencent-cosx-cos-request-id: NjEzODU3ZDhfZmNkMzgwYl9kYjg0Xz****x-cos-storage-class: STANDARD
示例二:获取软链接本身(GET Symlink)
请求
GET /sym?symlink= HTTP/1.1Host: examplebucket.cos.ap-beijing.myqcloud.comAuthorization: q-sign-algorithm=sha1&q-ak=************************************&q-sign-time=1631071041;1632071091&q-key-time=1631071041;1632071091&q-url-param-list=symlink&q-header-list=host&q-signature=****************************************
响应
HTTP/1.1 200 OKContent-Type: application/xmlContent-Length: 0Connection: keep-aliveDate: Wed, 08 Sep 2021 06:36:59 GMTETag: "db5570bf61464b46e2bde31ed61a7dc6"Last-Modified: Wed, 08 Sep 2021 06:27:36 GMTServer: tencent-cosx-cos-request-id: NjEzODVhMGJfNjQ1MjQ0MGJfMjBmMTZfM****x-cos-symlink-target: tar
示例三:通过软链接下载真实对象(GET Object)
请求
GET /sym HTTP/1.1Host: examplebucket.cos.ap-beijing.myqcloud.comAuthorization: q-sign-algorithm=sha1&q-ak=************************************&q-sign-time=1631071077;1632071127&q-key-time=1631071077;1632071127&q-url-param-list=&q-header-list=host&q-signature=****************************************
响应
HTTP/1.1 200 OKAccept-Ranges: bytesContent-Length: 6Content-Type: application/x-tarDate: Wed, 08 Sep 2021 06:41:30 GMTEtag: "4a1dbd5124d2ff06740c55ea3ec89f22"Last-Modified: Wed, 08 Sep 2021 06:27:36 GMTServer: tencent-cosX-Cache: MISS from SZ-SQUIDWEB-46X-Cache-Lookup: MISS from SZ-SQUIDWEB-46:8080X-Cos-Hash-Crc64ecma: 4071074640841670626X-Cos-Request-Id: NjEzODViMWFfYjU0ZTQ0MGJfMjI1M****
示例四:通过软链接获取源文件的元数据(HEAD Object)
请求
HEAD /sym HTTP/1.1Host: examplebucket.cos.ap-beijing.myqcloud.comAuthorization: q-sign-algorithm=sha1&q-ak=************************************&q-sign-time=1638;1632071158&q-key-time=1631071108;1632071158&q-url-param-list=&q-header-list=host&q-signature=****************************************
响应
HTTP/1.1 200 OKCache-Control: max-age=259200Content-Length: 6Content-Type: application/octet-streamDate: Wed, 08 Sep 2021 06:58:36 GMTEtag: "4a1dbd5124d2ff06740c55ea3ec89f22"Last-Modified: Wed, 08 Sep 2021 06:55:48 GMTServer: tencent-cosX-Cache: MISS from SZ-SQUIDWEB-46X-Cache-Lookup: MISS from SZ-SQUIDWEB-46:8080X-Cos-Hash-Crc64ecma: 4071074640841670626X-Cos-Request-Id: NjEzODVmMWNfNzk1MjQ0MGJfMTVjMGVfM****
示例五:删除软链接(DELETE Object)
请求
DELETE /sym HTTP/1.1Host: examplebucket.cos.ap-beijing.myqcloud.comAuthorization: q-sign-algorithm=sha1&q-ak=************************************&q-sign-time=1631071142;1632071192&q-key-time=1631071142;1632071192&q-url-param-list=&q-header-list=host&q-signature=****************************************
响应
HTTP/1.1 204 No ContentConnection: keep-aliveDate: Wed, 08 Sep 2021 07:01:43 GMTServer: tencent-cosx-cos-request-id: NjEzODVmZDdfMzBkMDM4MGJfMTRlMjJf****