默认情况下,如果新添加文件与现有文件(Object)同名且对该文件有访问权限,则新添加的文件将覆盖原有的文件。本文介绍如何通过设置请求头x-oss-forbid-overwrite在简单上传、拷贝文件及分片上传等场景中禁止覆盖同名文件。
注意事项
简单上传
以下代码用于简单上传时禁止覆盖同名文件:
package main
import (
"fmt"
"os"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// yourBucketName填写存储空间名称。
bucket, err := client.Bucket("yourBucketName")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 指定是否覆盖同名文件。
// 不指定oss.ForbidOverWrite时,默认覆盖同名Object。
// 指定oss.ForbidOverWrite为false时,表示允许覆盖同名Object。
// 指定oss.ForbidOverWrite为true时,表示禁止覆盖同名Object,如果同名Object已存在,程序将报错。
forbidWrite := oss.ForbidOverWrite(true)
// 上传字符串。
// yourObjectName填写不包含Bucket名称在内的Object的完整路径。
err = bucket.PutObject("yourObjectName", strings.NewReader("yourObjectValue"), forbidWrite)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
拷贝文件
以下代码用于拷贝文件时禁止覆盖同名文件:
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// yourBucketName填写存储空间名称。
bucketName := "yourBucketName"
// yourObjectName填写不包含Bucket名称在内的源Object的完整路径。
objectName := "yourObjectName"
// yourDestObjectName填写不包含Bucket名称在内的目标Object的完整路径。
destObjectName := "yourDestObjectName"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 指定是否覆盖同名目标文件。
// 不指定oss.ForbidOverWrite时,默认覆盖同名目标Object。
// 指定oss.ForbidOverWrite为false时,表示允许覆盖同名目标Object。
// 指定oss.ForbidOverWrite为true时,表示禁止覆盖同名目标Object,如果同名目标Object已存在,程序将报错。
forbidWrite := oss.ForbidOverWrite(true)
// 拷贝文件到同一个存储空间的另一个文件。
_, err = bucket.CopyObject(objectName, destObjectName, forbidWrite)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
分片上传
以下代码用于分片上传时禁止覆盖同名文件:
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// yourBucketName填写存储空间名称。
bucketName := "yourBucketName"
// yourObjectName填写不包含Bucket名称在内的Object的完整路径。
objectName := "yourObjectName"
// yourLocalFilename填写本地文件的完整路径。
locaFilename := "yourLocalFilename"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
chunks, err := oss.SplitFileByPartNum(locaFilename, 3)
fd, err := os.Open(locaFilename)
defer fd.Close()
// 指定是否覆盖同名文件。
// 不指定oss.ForbidOverWrite时,默认覆盖同名Object。
// 指定oss.ForbidOverWrite为false时,表示允许覆盖同名Object。
// 指定oss.ForbidOverWrite为true时,表示禁止覆盖同名Object,如果同名Object已存在,程序将报错。
forbidWrite := oss.ForbidOverWrite(true)
// 步骤1:初始化一个分片上传事件。
imur, err := bucket.InitiateMultipartUpload(objectName, forbidWrite)
// 步骤2:上传分片。
var parts []oss.UploadPart
for _, chunk := range chunks {
fd.Seek(chunk.Offset, os.SEEK_SET)
// 对每个分片调用UploadPart方法上传。
part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
parts = append(parts, part)
}
// 步骤3:完成分片上传,禁止覆盖同名文件。
cmur, err := bucket.CompleteMultipartUpload(imur, parts, forbidWrite)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("cmur:", cmur)
}
相关文档
- 关于简单上传的API接口说明,请参见PutObject。
- 关于拷贝文件的API接口说明,请参见CopyObject。
- 关于分片上传的API接口说明,请参见InitiateMultipartUpload以及CompleteMultipartUpload。