禁止覆盖同名文件
默认情况下,如果已经存在同名文件(Object)且对该文件有访问权限,则新添加的文件将覆盖原有的文件。本文介绍如何通过设置请求头x-oss-forbid-overwrite在简单上传、拷贝文件及分片上传等场景中禁止覆盖同名文件。
简单上传
以下代码用于简单上传时禁止覆盖同名文件:
package main
import (
"fmt"
"os"
"strings"
"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)
}
// 获取存储空间。
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)
// 上传字符串。
err = bucket.PutObject("<yourObjectName>", strings.NewReader("yourObjectValue"), forbidWrite)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
简单上传的更多详情,请参见PutObject。
拷贝文件
以下代码用于拷贝文件时禁止覆盖同名文件:
拷贝文件的更多详情,请参见CopyObject。
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)
}
// 指定是否覆盖同名目标文件。
// 不指定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实例。
client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
bucketName := "<yourBucketName>"
objectName := "<yourObjectName>"
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)
}
分片上传的更多详情,请参见InitiateMultipartUpload以及CompleteMultipartUpload。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论