默认情况下,如果已经存在同名文件(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