本文介绍如何拷贝文件。
拷贝文件的完整代码请参见GitHub。
同一存储空间内拷贝文件
以下代码用于在同一个存储空间内拷贝文件:
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 创建OSSClient实例。
client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
bucketName := "<yourBucketName>"
objectName := "<yourObjectName>"
destObjectName := "<yourDestObjectName>"
// 获取存储空间。
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 拷贝文件到同一个存储空间的另一个文件。
_, err = bucket.CopyObject(objectName, destObjectName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
跨存储空间拷贝文件
您可以将其它存储空间的文件拷贝到当前存储空间,也可以将当前存储空间的文件拷贝到其它存储空间。代码如下:
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 创建OSSClient实例。
client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
bucketName := "<yourBucketName>"
srcBucketName := "<yourSrcBucketName>"
dstBucketName := "<yourDstBucketName>"
srcObjectName := "<yourSrcObjectName>"
dstObjectName := "<yourDstObjectName>"
// 获取存储空间。
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 从其它存储空间(srcBucketName)拷贝源文件(srcObjectName)到本存储空间。
bucket.CopyObjectFrom(srcBucketName, srcObjectName, dstObjectName)
if err != nil {
fmt.Println("CopyObjectFrom Error:", err)
os.Exit(-1)
}
// 从本存储空间拷贝源文件(srcObjectName)到其它存储空间(dstBucketName)。
bucket.CopyObjectTo(dstBucketName, dstObjectName, srcObjectName)
if err != nil {
fmt.Println("CopyObjectTo Error:", err)
os.Exit(-1)
}
}
拷贝时处理文件元信息
您可以在拷贝文件时通过MetadataDirective参数来处理文件元信息。MetadataDirective的取值如下:
- oss.MetaCopy:默认值。目标文件的元信息与源文件的元信息相同,即拷贝源文件的元信息。
- oss.MetaReplace:使用指定的元信息覆盖源文件的元信息。
注意 oss.MetaReplace将覆盖源文件的全部元信息,且无法恢复,请谨慎操作。
MetadataDirective取值为oss.MetaReplace时,可以指定的元信息如下:
参数 | 说明 |
---|---|
CacheControl | 指定目标文件被下载时的网页的缓存行为。 |
ContentDisposition | 指定目标文件被下载时的名称。 |
ContentEncoding | 指定目标文件被下载时的内容编码格式。 |
Expires | 设置缓存过期时间,格式是格林威治时间(GMT)。 |
ServerSideEncryption | 指定OSS创建目标文件时的服务器端加密编码算法。有效值:AES256。 |
ObjectACL | 指定OSS创建的目标文件的访问权限。 |
Meta | 自定义元信息,以X-Oss-Meta- 为前缀的参数。 |
以下代码用于在拷贝时处理文件元信息:
package main
import (
"fmt"
"os"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 创建OSSClient实例。
client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
bucketName := "<yourBucketName>"
objectName := "<yourObjectName>"
destObjectName := "<yourDestObjectName>"
// 获取存储空间。
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 指定目标文件的元信息。
expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
options := []oss.Option{
oss.MetadataDirective(oss.MetaReplace),
oss.Expires(expires),
oss.ObjectACL(oss.ACLPublicRead),
oss.Meta("MyMeta", "MyMetaValue")}
// 使用指定的元信息覆盖源文件的元信息。
_, err = bucket.CopyObject(objectName, destObjectName, options...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
限定条件拷贝
拷贝文件时,可以指定一个或多个限定条件。满足限定条件则拷贝,不满足则返回错误,不拷贝。可以使用的限定条件如下:
参数 | 说明 |
---|---|
CopySourceIfMatch | 如果源文件的ETag和指定的ETag匹配,则执行拷贝操作;否则返回错误。 |
CopySourceIfNoneMatch | 如果源文件的ETag和指定的ETag不匹配,则执行拷贝操作;否则返回错误。 |
CopySourceIfModifiedSince | 如果指定的时间早于实际修改时间,则执行拷贝操作;否则返回错误。 |
CopySourceIfUnmodifiedSince | 如果指定的时间等于或者晚于文件实际修改时间,则执行拷贝操作;否则返回错误。 |
CopySourceIfMatch和CopySourceIfNoneMatch可以同时存在。CopySourceIfModifiedSince和CopySourceIfUnmodifiedSince可以同时存在。
以下代码用于限定条件拷贝:
package main
import (
"fmt"
"os"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 创建OSSClient实例。
client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// bucketName := "<yourBucketName>"
// objectName := "<yourObjectName>"
bucketName := "<yourBucketName>"
objectName := "<yourObjectName>"
destMatchObjectName := "<yourMatchDestObjectName>"
destUnMatchObjectName := "<yourUnmatchDestObjectName>"
// 获取存储空间。
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
date := time.Date(2011, time.November, 10, 23, 0, 0, 0, time.UTC)
// 满足限定条件,执行拷贝。
_, err = bucket.CopyObject(objectName, destMatchObjectName, oss.CopySourceIfModifiedSince(date))
if err != nil {
fmt.Println("CopyObject CopySourceIfModifiedSince Error:", err)
}
// 不满足限定条件,不执行拷贝。
_, err = bucket.CopyObject(objectName, destUnMatchObjectName, oss.CopySourceIfUnmodifiedSince(date))
if err != nil {
fmt.Println("CopyObject CopySourceIfUnmodifiedSince Error:", err)
}
}