package main
import (
"context"
"flag"
"log"
"os"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
region string // 存储区域
bucketName string // 存储空间名称
objectName string // 对象名称
)
// init函数用于初始化命令行参数
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
flag.StringVar(&objectName, "object", "", "The name of the object.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查存储空间名称是否为空
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 检查存储区域是否为空
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 检查对象名称是否为空
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// 配置OSS客户端
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 创建OSS客户端
client := oss.NewClient(cfg)
// 创建一个追加文件的实例
f, err := client.AppendFile(context.TODO(),
bucketName,
objectName,
func(ao *oss.AppendOptions) {
ao.CreateParameter = &oss.AppendObjectRequest{
Acl: oss.ObjectACLPrivate, // 设置对象的访问权限为私有
Metadata: map[string]string{
"user": "jack", // 设置对象的元数据
},
Tagging: oss.Ptr("key=value"), // 设置对象的标签
}
})
if err != nil {
log.Fatalf("failed to append file %v", err)
}
defer f.Close() // 确保文件流在函数结束时关闭
// 打开本地文件 example1.txt
lf, err := os.Open("/local/dir/example1.txt")
if err != nil {
log.Fatalf("failed to open local file %v", err)
}
// 将 example1.txt 的内容追加到 OSS 对象
_, err = f.WriteFrom(lf)
if err != nil {
log.Fatalf("failed to append file %v", err)
}
lf.Close() // 关闭本地文件
// 打开本地文件 example2.txt
lf, err = os.Open("/local/dir/example2.txt")
if err != nil {
log.Fatalf("failed to open local file %v", err)
}
// 将 example2.txt 的内容追加到 OSS 对象
_, err = f.WriteFrom(lf)
if err != nil {
log.Fatalf("failed to append file %v", err)
}
lf.Close() // 关闭本地文件
// 读取本地文件 example3.txt 的内容
lb, err := os.ReadFile("/local/dir/example3.txt")
if err != nil {
log.Fatalf("failed to read local file %v", err)
}
// 将 example3.txt 的内容追加到 OSS 对象
_, err = f.Write(lb)
if err != nil {
log.Fatalf("failed to append file %v", err)
}
// 打印成功追加文件的日志信息
log.Printf("append file successfully")
}