diff --git a/package/s3/s3.go b/package/s3/s3.go index 086a12c..8ab980b 100644 --- a/package/s3/s3.go +++ b/package/s3/s3.go @@ -270,7 +270,7 @@ func (s *Mod) GetPath(url string) (filePath string) { return url[len(get+bucketName)+1:] } -// 复制文件 +// CopyObject 复制文件 func (s *Mod) CopyObject(bucketName string, dstStr string, srcStr string) (err error) { // 原始文件 @@ -288,3 +288,15 @@ func (s *Mod) CopyObject(bucketName string, dstStr string, srcStr string) (err e _, err = s.client.CopyObject(ctx, dst, src) return } + +// Rename 重命名文件 +func (s *Mod) Rename(bucketName string, name string, newName string) (err error) { + // 复制文件到新的名称 + err = s.CopyObject(bucketName, name, newName) + if err != nil { + return + } + // 删除原始文件 + err = s.RemoveObject(bucketName, name) + return +} diff --git a/pkg/s3/s3.go b/pkg/s3/s3.go index 5f18a2c..642f75b 100644 --- a/pkg/s3/s3.go +++ b/pkg/s3/s3.go @@ -150,6 +150,7 @@ func (s *Mod) PutObject(f io.Reader, name string, bucketName string, _size ...in } // RemoveObject 从指定存储桶中删除指定名称的文件 +// Deprecation: to新方法 RemoveObjectV2 func (s *Mod) RemoveObject(name string, bucketName string) (err error) { opts := minio.RemoveObjectOptions{ ForceDelete: true, @@ -161,6 +162,18 @@ func (s *Mod) RemoveObject(name string, bucketName string) (err error) { return } +// RemoveObjectV2 从指定存储桶中删除指定名称的文件 +func (s *Mod) RemoveObjectV2(bucketName string, name string) (err error) { + opts := minio.RemoveObjectOptions{ + ForceDelete: true, + //GovernanceBypass: true, + //VersionID: "myversionid", + } + // 调用 S3 客户端删除文件 + err = s.client.RemoveObject(ctx, bucketName, name, opts) + return +} + // ListObjects 获取指定存储桶中指定前缀的文件列表 // 返回一个包含文件信息的通道 func (s *Mod) ListObjects(bucketName string, prefix string) (res <-chan minio.ObjectInfo, err error) { @@ -216,21 +229,43 @@ func (s *Mod) GetPath(url string) (filePath string) { } // CopyObject 在指定存储桶内复制文件 -// 支持指定源文件和目标文件路径 +// bucketName 存储桶名称 +// dstStr 目标文件路径 +// srcStr 源文件路径 +// 返回操作过程中可能出现的错误 func (s *Mod) CopyObject(bucketName string, dstStr string, srcStr string) (err error) { - // 定义目标文件选项 + // 定义目标文件的复制选项,包含存储桶名称和目标文件路径 var dst = minio.CopyDestOptions{ Bucket: bucketName, Object: dstStr, } - // 定义源文件选项 + // 定义源文件的复制选项,包含存储桶名称和源文件路径 var src = minio.CopySrcOptions{ Bucket: bucketName, Object: srcStr, } - // 调用 S3 客户端复制文件 + // 调用 S3 客户端的 CopyObject 方法,将源文件复制到目标位置 + // 忽略返回的复制信息,仅关注是否发生错误 _, err = s.client.CopyObject(ctx, dst, src) return } + +// Rename 重命名文件 +func (s *Mod) Rename(bucketName string, oldName string, newName string) (err error) { + // 复制文件到新的名称 + g.Log().Debugf(nil, "仓库=%v,rename %s to %s", bucketName, oldName, newName) + err = s.CopyObject(bucketName, newName, oldName) + if err != nil { + g.Log().Error(ctx, err) + return + } + // 删除原始文件 + err = s.RemoveObjectV2(bucketName, oldName) + if err != nil { + g.Log().Error(ctx, err) + return + } + return +}