storage

package
v1.6.12 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 16, 2026 License: GPL-3.0 Imports: 39 Imported by: 0

Documentation

Overview

  • @Description: 阿里云OSS存储提供者实现

  • @Author: 安知鱼

  • @Date: 2025-09-28 18:00:00

  • @LastEditTime: 2025-12-02 18:22:36

  • @LastEditors: 安知鱼 *

  • 【重要:路径转换规则说明】 *

  • 本存储提供者中的方法接收两种类型的路径参数,必须正确区分: *

  • ┌─────────────────────────────────────────────────────────────────────────────┐

  • │ 类型1: virtualPath(完整虚拟路径) │

  • │ │

  • │ 格式: /挂载点/子目录/文件名 │

  • │ 示例: /oss/aaa/123.jpg │

  • │ │

  • │ 使用此参数的方法: │

  • │ - Upload() │

  • │ - List() │

  • │ - CreateDirectory() │

  • │ - DeleteDirectory() │

  • │ - Rename() │

  • │ - CreatePresignedUploadURL() │

  • │ │

  • │ 转换逻辑: 调用 buildObjectKey() 进行转换 │

  • │ 1. 从 virtualPath 中减去 policy.VirtualPath(挂载点)得到相对路径 │

  • │ 相对路径 = "/oss/aaa/123.jpg" - "/oss" = "/aaa/123.jpg" │

  • │ 2. 将相对路径与 policy.BasePath(云存储基础路径)拼接 │

  • │ 对象键 = "test" + "/aaa/123.jpg" = "test/aaa/123.jpg" │

  • └─────────────────────────────────────────────────────────────────────────────┘ *

  • ┌─────────────────────────────────────────────────────────────────────────────┐

  • │ 类型2: source(完整对象键) │

  • │ │

  • │ 格式: 云存储上的实际路径(已包含 BasePath) │

  • │ 示例: test/aaa/123.jpg │

  • │ │

  • │ 使用此参数的方法: │

  • │ - Get() │

  • │ - Delete() │

  • │ - DeleteSingle() │

  • │ - Stream() │

  • │ - GetDownloadURL() │

  • │ - IsExist() / Exists() │

  • │ - GetThumbnail() │

  • │ │

  • │ 处理逻辑: 直接使用,不需要任何转换 │

  • │ source 是从数据库 file_storage_entities.source 字段读取的值, │

  • │ 在文件上传时已经由 Upload() 方法生成并存储。 │

  • └─────────────────────────────────────────────────────────────────────────────┘ *

  • 【存储策略配置说明】 *

  • policy.VirtualPath: 策略在虚拟文件系统中的挂载点(如 "/oss")

  • policy.BasePath: 策略在云存储上的基础目录(如 "/test") *

  • 【数据库存储说明】 *

  • files 表:

  • - name 字段存储相对于挂载点的路径(不含挂载点本身)

  • - 例如: 文件 "/oss/aaa/123.jpg" 的 name 字段值为 "123.jpg"(文件名) *

  • file_storage_entities 表:

  • - source 字段存储云存储上的完整对象键

  • - 例如: "test/aaa/123.jpg" *

  • 【警告】修改路径转换逻辑前请仔细阅读以上说明!

  • @Description: AWS S3存储提供者实现(使用aws-sdk-go-v2)

  • @Author: 安知鱼

  • @Date: 2025-09-28 19:00:00

  • @LastEditTime: 2025-12-02 18:30:00

  • @LastEditors: 安知鱼 *

  • 【重要:路径转换规则说明】 *

  • 本存储提供者中的方法接收两种类型的路径参数,必须正确区分: *

  • ┌─────────────────────────────────────────────────────────────────────────────┐

  • │ 类型1: virtualPath(完整虚拟路径) │

  • │ │

  • │ 格式: /挂载点/子目录/文件名 │

  • │ 示例: /s3/aaa/123.jpg │

  • │ │

  • │ 使用此参数的方法: │

  • │ - Upload() │

  • │ - List() │

  • │ - CreateDirectory() │

  • │ - DeleteDirectory() │

  • │ - Rename() │

  • │ - CreatePresignedUploadURL() │

  • │ │

  • │ 转换逻辑: 调用 buildObjectKey() 进行转换 │

  • │ 1. 从 virtualPath 中减去 policy.VirtualPath(挂载点)得到相对路径 │

  • │ 相对路径 = "/s3/aaa/123.jpg" - "/s3" = "/aaa/123.jpg" │

  • │ 2. 将相对路径与 policy.BasePath(云存储基础路径)拼接 │

  • │ 对象键 = "test" + "/aaa/123.jpg" = "test/aaa/123.jpg" │

  • └─────────────────────────────────────────────────────────────────────────────┘ *

  • ┌─────────────────────────────────────────────────────────────────────────────┐

  • │ 类型2: source(完整对象键) │

  • │ │

  • │ 格式: 云存储上的实际路径(已包含 BasePath) │

  • │ 示例: test/aaa/123.jpg │

  • │ │

  • │ 使用此参数的方法: │

  • │ - Get() │

  • │ - Delete() │

  • │ - DeleteSingle() │

  • │ - Stream() │

  • │ - GetDownloadURL() │

  • │ - IsExist() / Exists() │

  • │ - GetThumbnail() │

  • │ │

  • │ 处理逻辑: 直接使用,不需要任何转换 │

  • │ source 是从数据库 file_storage_entities.source 字段读取的值, │

  • │ 在文件上传时已经由 Upload() 方法生成并存储。 │

  • └─────────────────────────────────────────────────────────────────────────────┘ *

  • 【存储策略配置说明】 *

  • policy.VirtualPath: 策略在虚拟文件系统中的挂载点(如 "/s3")

  • policy.BasePath: 策略在云存储上的基础目录(如 "/test") *

  • 【警告】修改路径转换逻辑前请仔细阅读以上说明!

internal/infra/storage/local.go

  • @Description: OneDrive 存储驱动的具体实现

  • @Author: 安知鱼

  • @Date: 2025-07-15 17:50:00

  • @LastEditTime: 2025-12-01 12:57:00

  • @LastEditors: 安知鱼

  • @Description: 定义了所有存储驱动需要遵守的接口和公共结构

  • @Author: 安知鱼

  • @Date: 2025-06-28 00:21:55

  • @LastEditTime: 2025-07-23 11:26:38

  • @LastEditors: 安知鱼

  • @Description: 七牛云Kodo存储提供者实现

  • @Author: 安知鱼

  • @Date: 2025-01-05 00:00:00

  • @LastEditTime: 2025-01-05 00:00:00

  • @LastEditors: 安知鱼 *

  • 【重要:路径转换规则说明】 *

  • 本存储提供者中的方法接收两种类型的路径参数,必须正确区分: *

  • ┌─────────────────────────────────────────────────────────────────────────────┐

  • │ 类型1: virtualPath(完整虚拟路径) │

  • │ │

  • │ 格式: /挂载点/子目录/文件名 │

  • │ 示例: /qiniu/aaa/123.jpg │

  • │ │

  • │ 使用此参数的方法: │

  • │ - Upload() │

  • │ - List() │

  • │ - CreateDirectory() │

  • │ - DeleteDirectory() │

  • │ - Rename() │

  • │ - CreatePresignedUploadURL() │

  • │ │

  • │ 转换逻辑: 调用 buildObjectKey() 进行转换 │

  • │ 1. 从 virtualPath 中减去 policy.VirtualPath(挂载点)得到相对路径 │

  • │ 相对路径 = "/qiniu/aaa/123.jpg" - "/qiniu" = "/aaa/123.jpg" │

  • │ 2. 将相对路径与 policy.BasePath(云存储基础路径)拼接 │

  • │ 对象键 = "test" + "/aaa/123.jpg" = "test/aaa/123.jpg" │

  • └─────────────────────────────────────────────────────────────────────────────┘ *

  • ┌─────────────────────────────────────────────────────────────────────────────┐

  • │ 类型2: source(完整对象键) │

  • │ │

  • │ 格式: 云存储上的实际路径(已包含 BasePath) │

  • │ 示例: test/aaa/123.jpg │

  • │ │

  • │ 使用此参数的方法: │

  • │ - Get() │

  • │ - Delete() │

  • │ - Stream() │

  • │ - GetDownloadURL() │

  • │ - IsExist() │

  • │ - GetThumbnail() │

  • │ │

  • │ 处理逻辑: 直接使用,不需要任何转换 │

  • │ source 是从数据库 file_storage_entities.source 字段读取的值, │

  • │ 在文件上传时已经由 Upload() 方法生成并存储。 │

  • └─────────────────────────────────────────────────────────────────────────────┘ *

  • 【存储策略配置说明】 *

  • policy.VirtualPath: 策略在虚拟文件系统中的挂载点(如 "/qiniu")

  • policy.BasePath: 策略在云存储上的基础目录(如 "/test")

  • policy.Server: 存储区域上传域名(如 "https://up-z2.qiniup.com")

  • settings.cdn_domain: CDN/访问域名(如 "https://cdn.example.com") *

  • 【警告】修改路径转换逻辑前请仔细阅读以上说明!

  • @Description: 腾讯云COS存储提供者实现

  • @Author: 安知鱼

  • @Date: 2025-09-28 12:00:00

  • @LastEditTime: 2025-12-02 18:30:00

  • @LastEditors: 安知鱼 *

  • 【重要:路径转换规则说明】 *

  • 本存储提供者中的方法接收两种类型的路径参数,必须正确区分: *

  • ┌─────────────────────────────────────────────────────────────────────────────┐

  • │ 类型1: virtualPath(完整虚拟路径) │

  • │ │

  • │ 格式: /挂载点/子目录/文件名 │

  • │ 示例: /cos/aaa/123.jpg │

  • │ │

  • │ 使用此参数的方法: │

  • │ - Upload() │

  • │ - List() │

  • │ - CreateDirectory() │

  • │ - DeleteDirectory() │

  • │ - Rename() │

  • │ - CreatePresignedUploadURL() │

  • │ │

  • │ 转换逻辑: 调用 buildObjectKey() 进行转换 │

  • │ 1. 从 virtualPath 中减去 policy.VirtualPath(挂载点)得到相对路径 │

  • │ 相对路径 = "/cos/aaa/123.jpg" - "/cos" = "/aaa/123.jpg" │

  • │ 2. 将相对路径与 policy.BasePath(云存储基础路径)拼接 │

  • │ 对象键 = "test" + "/aaa/123.jpg" = "test/aaa/123.jpg" │

  • └─────────────────────────────────────────────────────────────────────────────┘ *

  • ┌─────────────────────────────────────────────────────────────────────────────┐

  • │ 类型2: source(完整对象键) │

  • │ │

  • │ 格式: 云存储上的实际路径(已包含 BasePath) │

  • │ 示例: test/aaa/123.jpg │

  • │ │

  • │ 使用此参数的方法: │

  • │ - Get() │

  • │ - Delete() │

  • │ - Stream() │

  • │ - GetDownloadURL() │

  • │ - IsExist() / IsExistWithPolicy() │

  • │ - GetThumbnail() │

  • │ │

  • │ 处理逻辑: 直接使用,不需要任何转换 │

  • │ source 是从数据库 file_storage_entities.source 字段读取的值, │

  • │ 在文件上传时已经由 Upload() 方法生成并存储。 │

  • └─────────────────────────────────────────────────────────────────────────────┘ *

  • 【存储策略配置说明】 *

  • policy.VirtualPath: 策略在虚拟文件系统中的挂载点(如 "/cos")

  • policy.BasePath: 策略在云存储上的基础目录(如 "/test") *

  • 【警告】修改路径转换逻辑前请仔细阅读以上说明!

Index

Constants

This section is empty.

Variables

View Source
var ErrFeatureNotSupported = errors.New("feature not supported by this provider")

定义一个错误,用于表示某个功能不被当前 Provider 支持

Functions

This section is empty.

Types

type AWSS3Provider added in v1.2.0

type AWSS3Provider struct {
}

AWSS3Provider 实现了 IStorageProvider 接口,用于处理与AWS S3的所有交互。

func (*AWSS3Provider) CreateDirectory added in v1.2.0

func (p *AWSS3Provider) CreateDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

CreateDirectory 在AWS S3中创建目录(通过创建空对象模拟)

func (*AWSS3Provider) CreatePresignedUploadURL added in v1.6.3

func (p *AWSS3Provider) CreatePresignedUploadURL(ctx context.Context, policy *model.StoragePolicy, virtualPath string) (*PresignedUploadResult, error)

CreatePresignedUploadURL 为客户端直传创建一个预签名的上传URL 客户端可以使用此URL直接PUT文件到AWS S3,无需经过服务器中转

【路径转换规则】 virtualPath 是完整的虚拟路径,格式为: /挂载点/子目录/文件名 例如: virtualPath = "/s3/aaa/123.jpg"

转换步骤(与 Upload 方法相同):

  1. 从 virtualPath 中减去 policy.VirtualPath(挂载点),得到相对路径 相对路径 = "/s3/aaa/123.jpg" - "/s3" = "/aaa/123.jpg"
  2. 将相对路径与 policy.BasePath(云存储基础路径)拼接 对象键 = "/test" + "/aaa/123.jpg" = "test/aaa/123.jpg"

func (*AWSS3Provider) Delete added in v1.2.0

func (p *AWSS3Provider) Delete(ctx context.Context, policy *model.StoragePolicy, sources []string) error

Delete 从AWS S3删除多个文件 Delete 从AWS S3删除多个文件 sources 是完整的对象键列表(如 "article_image_cos/logo.png"),已包含 basePath,无需再拼接

func (*AWSS3Provider) DeleteDirectory added in v1.2.0

func (p *AWSS3Provider) DeleteDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

DeleteDirectory 删除AWS S3中的空目录

func (*AWSS3Provider) DeleteSingle added in v1.2.0

func (p *AWSS3Provider) DeleteSingle(ctx context.Context, policy *model.StoragePolicy, source string) error

DeleteSingle 从AWS S3删除单个文件(内部使用)

func (*AWSS3Provider) Exists added in v1.2.0

func (p *AWSS3Provider) Exists(ctx context.Context, policy *model.StoragePolicy, source string) (bool, error)

Exists 检查文件是否存在于AWS S3中(带policy参数的版本)

func (*AWSS3Provider) Get added in v1.2.0

func (p *AWSS3Provider) Get(ctx context.Context, policy *model.StoragePolicy, source string) (io.ReadCloser, error)

Get 从AWS S3获取文件流

func (*AWSS3Provider) GetDownloadURL added in v1.2.0

func (p *AWSS3Provider) GetDownloadURL(ctx context.Context, policy *model.StoragePolicy, source string, options DownloadURLOptions) (string, error)

GetDownloadURL 根据存储策略权限设置生成AWS S3下载URL source 是完整的对象键(如 "article_image_cos/logo.png"),已包含 basePath,无需再拼接

func (*AWSS3Provider) GetThumbnail added in v1.2.0

func (p *AWSS3Provider) GetThumbnail(ctx context.Context, policy *model.StoragePolicy, source string, size string) (*ThumbnailResult, error)

GetThumbnail 获取缩略图(AWS S3不直接支持)

func (*AWSS3Provider) IsExist added in v1.2.0

func (p *AWSS3Provider) IsExist(ctx context.Context, policy *model.StoragePolicy, source string) (bool, error)

IsExist 检查文件是否存在于AWS S3中 IsExist 检查文件是否存在于AWS S3中 source 是完整的对象键(如 "article_image_cos/logo.png"),已包含 basePath,无需再拼接

func (*AWSS3Provider) List added in v1.2.0

func (p *AWSS3Provider) List(ctx context.Context, policy *model.StoragePolicy, virtualPath string) ([]FileInfo, error)

List 列出AWS S3存储桶中的对象

func (*AWSS3Provider) Rename added in v1.2.0

func (p *AWSS3Provider) Rename(ctx context.Context, policy *model.StoragePolicy, oldVirtualPath, newVirtualPath string) error

Rename 重命名或移动AWS S3中的文件或目录 Rename 重命名或移动AWS S3中的文件或目录 oldVirtualPath 和 newVirtualPath 是相对于 policy.VirtualPath 的路径,需要通过 buildObjectKey 转换为完整对象键

func (*AWSS3Provider) Stream added in v1.2.0

func (p *AWSS3Provider) Stream(ctx context.Context, policy *model.StoragePolicy, source string, writer io.Writer) error

Stream 从AWS S3流式传输文件到writer

func (*AWSS3Provider) Upload added in v1.2.0

func (p *AWSS3Provider) Upload(ctx context.Context, file io.Reader, policy *model.StoragePolicy, virtualPath string) (*UploadResult, error)

Upload 上传文件到AWS S3

【路径转换规则】 virtualPath 是完整的虚拟路径,格式为: /挂载点/子目录/文件名 例如: virtualPath = "/s3/aaa/123.jpg"

转换步骤:

  1. 从 virtualPath 中减去 policy.VirtualPath(挂载点),得到相对路径 相对路径 = "/s3/aaa/123.jpg" - "/s3" = "/aaa/123.jpg"
  2. 将相对路径与 policy.BasePath(云存储基础路径)拼接 对象键 = "/test" + "/aaa/123.jpg" = "test/aaa/123.jpg"

数据库 files 表的 name 字段存储的是相对于挂载点的路径(不含挂载点)

type AliOSSProvider added in v1.2.0

type AliOSSProvider struct {
}

AliOSSProvider 实现了 IStorageProvider 接口,用于处理与阿里云OSS的所有交互。

func (*AliOSSProvider) CreateDirectory added in v1.2.0

func (p *AliOSSProvider) CreateDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

CreateDirectory 在阿里云OSS中创建目录(通过创建空对象模拟)

func (*AliOSSProvider) CreatePresignedUploadURL added in v1.6.3

func (p *AliOSSProvider) CreatePresignedUploadURL(ctx context.Context, policy *model.StoragePolicy, virtualPath string) (*PresignedUploadResult, error)

CreatePresignedUploadURL 为客户端直传创建一个预签名的上传URL 客户端可以使用此URL直接PUT文件到阿里云OSS,无需经过服务器中转

【路径转换规则】 virtualPath 是完整的虚拟路径,格式为: /挂载点/子目录/文件名 例如: virtualPath = "/oss/aaa/123.jpg"

转换步骤(与 Upload 方法相同):

  1. 从 virtualPath 中减去 policy.VirtualPath(挂载点),得到相对路径 相对路径 = "/oss/aaa/123.jpg" - "/oss" = "/aaa/123.jpg"
  2. 将相对路径与 policy.BasePath(云存储基础路径)拼接 对象键 = "/test" + "/aaa/123.jpg" = "test/aaa/123.jpg"

func (*AliOSSProvider) Delete added in v1.2.0

func (p *AliOSSProvider) Delete(ctx context.Context, policy *model.StoragePolicy, sources []string) error

Delete 从阿里云OSS删除多个文件 Delete 从阿里云OSS删除多个文件 sources 是完整的对象键列表(如 "article_image_cos/logo.png"),已包含 basePath,无需再拼接

func (*AliOSSProvider) DeleteDirectory added in v1.2.0

func (p *AliOSSProvider) DeleteDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

DeleteDirectory 删除阿里云OSS中的空目录

func (*AliOSSProvider) DeleteSingle added in v1.2.0

func (p *AliOSSProvider) DeleteSingle(ctx context.Context, policy *model.StoragePolicy, source string) error

DeleteSingle 从阿里云OSS删除单个文件(内部使用)

func (*AliOSSProvider) Exists added in v1.2.0

func (p *AliOSSProvider) Exists(ctx context.Context, policy *model.StoragePolicy, source string) (bool, error)

Exists 检查文件是否存在于阿里云OSS中(带policy参数的版本)

func (*AliOSSProvider) Get added in v1.2.0

func (p *AliOSSProvider) Get(ctx context.Context, policy *model.StoragePolicy, source string) (io.ReadCloser, error)

Get 从阿里云OSS获取文件流

func (*AliOSSProvider) GetCORSConfig added in v1.6.4

func (p *AliOSSProvider) GetCORSConfig(ctx context.Context, policy *model.StoragePolicy) ([]oss.CORSRule, error)

GetCORSConfig 获取阿里云OSS存储桶的跨域配置

func (*AliOSSProvider) GetDownloadURL added in v1.2.0

func (p *AliOSSProvider) GetDownloadURL(ctx context.Context, policy *model.StoragePolicy, source string, options DownloadURLOptions) (string, error)

GetDownloadURL 根据存储策略权限设置生成阿里云OSS下载URL source 是完整的对象键(如 "article_image_cos/logo.png"),已包含 basePath,无需再拼接

func (*AliOSSProvider) GetThumbnail added in v1.2.0

func (p *AliOSSProvider) GetThumbnail(ctx context.Context, policy *model.StoragePolicy, source string, size string) (*ThumbnailResult, error)

GetThumbnail 阿里云OSS的图片处理(IMG)服务支持实时图片处理,可以生成缩略图 如果用户在阿里云控制台开通了图片处理服务,此功能将自动可用

func (*AliOSSProvider) IsExist added in v1.2.0

func (p *AliOSSProvider) IsExist(ctx context.Context, policy *model.StoragePolicy, source string) (bool, error)

IsExist 检查文件是否存在于阿里云OSS中 IsExist 检查文件是否存在于阿里云OSS中 source 是完整的对象键(如 "article_image_cos/logo.png"),已包含 basePath,无需再拼接

func (*AliOSSProvider) List added in v1.2.0

func (p *AliOSSProvider) List(ctx context.Context, policy *model.StoragePolicy, virtualPath string) ([]FileInfo, error)

List 列出阿里云OSS存储桶中的对象

func (*AliOSSProvider) Rename added in v1.2.0

func (p *AliOSSProvider) Rename(ctx context.Context, policy *model.StoragePolicy, oldVirtualPath, newVirtualPath string) error

Rename 重命名或移动阿里云OSS中的文件或目录 Rename 重命名或移动阿里云OSS中的文件或目录 oldVirtualPath 和 newVirtualPath 是相对于 policy.VirtualPath 的路径,需要通过 buildObjectKey 转换为完整对象键

func (*AliOSSProvider) SetupCORS added in v1.6.4

func (p *AliOSSProvider) SetupCORS(ctx context.Context, policy *model.StoragePolicy) error

SetupCORS 为阿里云OSS存储桶配置跨域策略 配置允许所有来源访问,支持GET, POST, PUT, DELETE, HEAD方法

func (*AliOSSProvider) Stream added in v1.2.0

func (p *AliOSSProvider) Stream(ctx context.Context, policy *model.StoragePolicy, source string, writer io.Writer) error

Stream 从阿里云OSS流式传输文件到writer

func (*AliOSSProvider) Upload added in v1.2.0

func (p *AliOSSProvider) Upload(ctx context.Context, file io.Reader, policy *model.StoragePolicy, virtualPath string) (*UploadResult, error)

Upload 上传文件到阿里云OSS

【路径转换规则】 virtualPath 是完整的虚拟路径,格式为: /挂载点/子目录/文件名 例如: virtualPath = "/oss/aaa/123.jpg"

转换步骤:

  1. 从 virtualPath 中减去 policy.VirtualPath(挂载点),得到相对路径 相对路径 = "/oss/aaa/123.jpg" - "/oss" = "/aaa/123.jpg"
  2. 将相对路径与 policy.BasePath(云存储基础路径)拼接 对象键 = "/test" + "/aaa/123.jpg" = "test/aaa/123.jpg"

数据库 files 表的 name 字段存储的是相对于挂载点的路径(不含挂载点)

type DownloadURLOptions

type DownloadURLOptions struct {
	PublicID    string // 文件的公共ID,用于本地存储签名
	ExpiresIn   int64  // 链接的有效时长(秒)
	QueryParams string // 图片处理参数(如 imageMogr2/format/avif 或 x-oss-process=image/format,webp)
}

DownloadURLOptions 包含了生成下载链接时可能需要的额外参数

type FileInfo

type FileInfo struct {
	Name    string
	Size    int64
	IsDir   bool
	ModTime time.Time
}

FileInfo 封装了 List 操作返回的单个文件或目录的信息。 这是为了统一本地和云端存储的列表返回结构,让上层服务(如 SyncService)可以透明处理。

type IStorageProvider

type IStorageProvider interface {
	// Upload 将文件流上传到指定的存储策略。
	Upload(ctx context.Context, file io.Reader, policy *model.StoragePolicy, virtualPath string) (*UploadResult, error)
	// CreateDirectory 在存储中创建一个目录。
	CreateDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error
	// Delete 删除一个或多个物理文件,需要处理空文件夹情况。
	Delete(ctx context.Context, policy *model.StoragePolicy, sources []string) error
	// GetDownloadURL 为存储中的文件生成一个临时的、可公开访问的下载链接。
	GetDownloadURL(ctx context.Context, policy *model.StoragePolicy, source string, options DownloadURLOptions) (string, error)
	// DeleteDirectory 删除一个空目录。
	DeleteDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error
	// Rename 重命名或移动存储中的文件或目录。
	Rename(ctx context.Context, policy *model.StoragePolicy, oldVirtualPath, newVirtualPath string) error
	// Stream 将文件内容以流式传输到给定的写入器。
	Stream(ctx context.Context, policy *model.StoragePolicy, source string, writer io.Writer) error
	// IsExist 检查给定的源路径是否存在物理文件。
	IsExist(ctx context.Context, policy *model.StoragePolicy, source string) (bool, error)
	// Get 返回一个可读的文件流,用于服务内部的文件处理,如元数据提取。
	Get(ctx context.Context, policy *model.StoragePolicy, source string) (io.ReadCloser, error)
	// List 列出指定虚拟路径下的所有文件和目录。
	List(ctx context.Context, policy *model.StoragePolicy, virtualPath string) ([]FileInfo, error)
	// GetThumbnail 获取指定文件的缩略图。
	GetThumbnail(ctx context.Context, policy *model.StoragePolicy, source string, size string) (*ThumbnailResult, error)
}

IStorageProvider 定义了所有存储提供者必须实现的接口。

func NewAWSS3Provider added in v1.2.0

func NewAWSS3Provider() IStorageProvider

NewAWSS3Provider 是 AWSS3Provider 的构造函数。

func NewAliOSSProvider added in v1.2.0

func NewAliOSSProvider() IStorageProvider

NewAliOSSProvider 是 AliOSSProvider 的构造函数。

func NewLocalProvider

func NewLocalProvider(secret string) IStorageProvider

NewLocalProvider 是 LocalProvider 的构造函数,接收一个用于URL签名的密钥。

func NewOneDriveProvider

func NewOneDriveProvider(policyRepo repository.StoragePolicyRepository) IStorageProvider

NewOneDriveProvider 是 OneDriveProvider 的构造函数。

func NewQiniuKodoProvider added in v1.6.11

func NewQiniuKodoProvider() IStorageProvider

NewQiniuKodoProvider 是 QiniuKodoProvider 的构造函数。

func NewTencentCOSProvider added in v1.2.0

func NewTencentCOSProvider() IStorageProvider

NewTencentCOSProvider 是 TencentCOSProvider 的构造函数。

type LocalProvider

type LocalProvider struct {
	// contains filtered or unexported fields
}

LocalProvider 实现了 IStorageProvider 接口,用于处理与本机磁盘文件系统的所有交互。

func (*LocalProvider) CreateDirectory

func (p *LocalProvider) CreateDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

CreateDirectory 实现了在本机创建物理目录的逻辑。

func (*LocalProvider) Delete

func (p *LocalProvider) Delete(ctx context.Context, policy *model.StoragePolicy, sources []string) error

Delete 实现了删除本机上一个或多个物理文件或目录的逻辑。

func (*LocalProvider) DeleteDirectory

func (p *LocalProvider) DeleteDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

DeleteDirectory 实现了删除本机上一个空目录的逻辑。

func (*LocalProvider) Get

func (p *LocalProvider) Get(ctx context.Context, policy *model.StoragePolicy, source string) (io.ReadCloser, error)

Get 实现了从本机磁盘获取文件读取器的逻辑。

func (*LocalProvider) GetDownloadURL

func (p *LocalProvider) GetDownloadURL(ctx context.Context, policy *model.StoragePolicy, source string, options DownloadURLOptions) (string, error)

GetDownloadURL 为本地文件生成一个带签名的、有时间限制的临时下载链接。

func (*LocalProvider) GetThumbnail

func (p *LocalProvider) GetThumbnail(ctx context.Context, policy *model.StoragePolicy, source string, size string) (*ThumbnailResult, error)

GetThumbnail 实现了 IStorageProvider 接口。 对于本地存储,它不提供原生缩略图功能,因此总是返回 ErrFeatureNotSupported。

func (*LocalProvider) IsExist

func (p *LocalProvider) IsExist(ctx context.Context, policy *model.StoragePolicy, source string) (bool, error)

IsExist 检查本地文件系统中指定路径的文件或目录是否存在。

func (*LocalProvider) List

func (p *LocalProvider) List(ctx context.Context, policy *model.StoragePolicy, virtualPath string) ([]FileInfo, error)

List 实现了为本地文件系统列出目录内容的功能。

func (*LocalProvider) Rename

func (p *LocalProvider) Rename(ctx context.Context, policy *model.StoragePolicy, oldVirtualPath, newVirtualPath string) error

Rename 重命名本地文件系统上的文件或目录。

func (*LocalProvider) Stream

func (p *LocalProvider) Stream(ctx context.Context, policy *model.StoragePolicy, source string, writer io.Writer) error

Stream 实现了从本机磁盘流式读取文件并将其内容写入给定的 io.Writer。

func (*LocalProvider) Upload

func (p *LocalProvider) Upload(ctx context.Context, file io.Reader, policy *model.StoragePolicy, virtualPath string) (*UploadResult, error)

Upload 实现了将文件流保存到本机磁盘的逻辑。

type OneDriveProvider

type OneDriveProvider struct {
	// contains filtered or unexported fields
}

OneDriveProvider 实现了 IStorageProvider 接口,用于处理与 Microsoft OneDrive 的所有交互。

func (*OneDriveProvider) CreateDirectory

func (p *OneDriveProvider) CreateDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

CreateDirectory 在存储中创建一个目录。 此实现是幂等的:如果目录已存在,不会返回错误。

func (*OneDriveProvider) CreatePresignedUploadURL

func (p *OneDriveProvider) CreatePresignedUploadURL(ctx context.Context, policy *model.StoragePolicy, virtualPath string) (*PresignedUploadResult, error)

CreatePresignedUploadURL 为客户端直传创建一个临时的上传会话和URL。

func (*OneDriveProvider) Delete

func (p *OneDriveProvider) Delete(ctx context.Context, policy *model.StoragePolicy, sources []string) error

Delete 从 OneDrive 删除一个或多个物理文件或目录。 注意:OneDrive的实现暂时忽略传入的policy参数,仍然使用原有的路径查找策略逻辑。

func (*OneDriveProvider) DeleteDirectory

func (p *OneDriveProvider) DeleteDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

DeleteDirectory 删除一个空目录或非空目录。 在 OneDrive 中,删除文件和目录使用相同的 API。

func (*OneDriveProvider) Get

func (p *OneDriveProvider) Get(ctx context.Context, policy *model.StoragePolicy, source string) (io.ReadCloser, error)

Get 返回一个可读的文件流,用于服务内部的文件处理,如元数据提取。

func (*OneDriveProvider) GetDownloadURL

func (p *OneDriveProvider) GetDownloadURL(ctx context.Context, policy *model.StoragePolicy, source string, options DownloadURLOptions) (string, error)

GetDownloadURL 为存储在 OneDrive 中的文件生成一个临时的、可公开访问的下载链接。

func (*OneDriveProvider) GetThumbnail

func (p *OneDriveProvider) GetThumbnail(ctx context.Context, policy *model.StoragePolicy, source string, size string) (*ThumbnailResult, error)

GetThumbnail 尝试从 OneDrive 直接获取文件的缩略图。

func (*OneDriveProvider) IsExist

func (p *OneDriveProvider) IsExist(ctx context.Context, policy *model.StoragePolicy, source string) (bool, error)

IsExist 检查给定的源路径在 OneDrive 上是否存在物理文件或目录。

func (*OneDriveProvider) List

func (p *OneDriveProvider) List(ctx context.Context, policy *model.StoragePolicy, virtualPath string) ([]FileInfo, error)

List 列出指定虚拟路径下的所有文件和目录。

func (*OneDriveProvider) Rename

func (p *OneDriveProvider) Rename(ctx context.Context, policy *model.StoragePolicy, oldVirtualPath, newVirtualPath string) error

Rename 重命名或移动存储中的文件或目录。 它通过更新项目的元数据(名称和/或父目录ID)来实现。

func (*OneDriveProvider) Stream

func (p *OneDriveProvider) Stream(ctx context.Context, policy *model.StoragePolicy, source string, writer io.Writer) error

Stream 将 OneDrive 中的文件内容以流式传输到给定的写入器,通常用于直接向客户端响应。

func (*OneDriveProvider) Upload

func (p *OneDriveProvider) Upload(ctx context.Context, file io.Reader, policy *model.StoragePolicy, virtualPath string) (*UploadResult, error)

Upload 将文件流上传到指定的存储策略。 它会根据文件大小自动选择简单上传或可续传的分片上传,并能懒创建父目录。

type PresignedUploadResult

type PresignedUploadResult struct {
	UploadURL          string    `json:"uploadUrl"`          // 预签名上传URL
	ExpirationDateTime time.Time `json:"expirationDateTime"` // URL过期时间
	ContentType        string    `json:"contentType"`        // 期望的 Content-Type,客户端上传时必须使用此值
}

PresignedUploadResult 封装了客户端直传所需的预签名信息

type QiniuKodoProvider added in v1.6.11

type QiniuKodoProvider struct {
}

QiniuKodoProvider 实现了 IStorageProvider 接口,用于处理与七牛云Kodo的所有交互。

func (*QiniuKodoProvider) CreateDirectory added in v1.6.11

func (p *QiniuKodoProvider) CreateDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

CreateDirectory 在七牛云Kodo中创建目录(通过创建空对象模拟)

func (*QiniuKodoProvider) CreatePresignedUploadURL added in v1.6.11

func (p *QiniuKodoProvider) CreatePresignedUploadURL(ctx context.Context, policy *model.StoragePolicy, virtualPath string) (*PresignedUploadResult, error)

CreatePresignedUploadURL 为客户端直传创建上传凭证

func (*QiniuKodoProvider) Delete added in v1.6.11

func (p *QiniuKodoProvider) Delete(ctx context.Context, policy *model.StoragePolicy, sources []string) error

Delete 从七牛云Kodo删除多个文件

func (*QiniuKodoProvider) DeleteDirectory added in v1.6.11

func (p *QiniuKodoProvider) DeleteDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

DeleteDirectory 删除七牛云Kodo中的空目录

func (*QiniuKodoProvider) Get added in v1.6.11

func (p *QiniuKodoProvider) Get(ctx context.Context, policy *model.StoragePolicy, source string) (io.ReadCloser, error)

Get 从七牛云Kodo获取文件流

func (*QiniuKodoProvider) GetDownloadURL added in v1.6.11

func (p *QiniuKodoProvider) GetDownloadURL(ctx context.Context, policy *model.StoragePolicy, source string, options DownloadURLOptions) (string, error)

GetDownloadURL 生成七牛云Kodo下载URL

func (*QiniuKodoProvider) GetThumbnail added in v1.6.11

func (p *QiniuKodoProvider) GetThumbnail(ctx context.Context, policy *model.StoragePolicy, source string, size string) (*ThumbnailResult, error)

GetThumbnail 使用七牛云图片处理服务生成缩略图

func (*QiniuKodoProvider) IsExist added in v1.6.11

func (p *QiniuKodoProvider) IsExist(ctx context.Context, policy *model.StoragePolicy, source string) (bool, error)

IsExist 检查文件是否存在于七牛云Kodo中

func (*QiniuKodoProvider) List added in v1.6.11

func (p *QiniuKodoProvider) List(ctx context.Context, policy *model.StoragePolicy, virtualPath string) ([]FileInfo, error)

List 列出七牛云Kodo存储空间中的对象

func (*QiniuKodoProvider) Rename added in v1.6.11

func (p *QiniuKodoProvider) Rename(ctx context.Context, policy *model.StoragePolicy, oldVirtualPath, newVirtualPath string) error

Rename 重命名或移动七牛云Kodo中的文件或目录

func (*QiniuKodoProvider) SetupCORS added in v1.6.11

func (p *QiniuKodoProvider) SetupCORS(ctx context.Context, policy *model.StoragePolicy) error

SetupCORS 为七牛云存储桶配置跨域策略 注意:七牛云的CORS配置需要在控制台进行,此方法仅作占位

func (*QiniuKodoProvider) Stream added in v1.6.11

func (p *QiniuKodoProvider) Stream(ctx context.Context, policy *model.StoragePolicy, source string, writer io.Writer) error

Stream 将七牛云Kodo文件内容流式传输到写入器

func (*QiniuKodoProvider) Upload added in v1.6.11

func (p *QiniuKodoProvider) Upload(ctx context.Context, file io.Reader, policy *model.StoragePolicy, virtualPath string) (*UploadResult, error)

Upload 上传文件到七牛云Kodo

type TencentCOSProvider added in v1.2.0

type TencentCOSProvider struct {
}

TencentCOSProvider 实现了 IStorageProvider 接口,用于处理与腾讯云COS的所有交互。

func (*TencentCOSProvider) CreateDirectory added in v1.2.0

func (p *TencentCOSProvider) CreateDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

CreateDirectory 在腾讯云COS中创建"目录"

func (*TencentCOSProvider) CreatePresignedUploadURL added in v1.6.3

func (p *TencentCOSProvider) CreatePresignedUploadURL(ctx context.Context, policy *model.StoragePolicy, virtualPath string) (*PresignedUploadResult, error)

CreatePresignedUploadURL 为客户端直传创建一个预签名的上传URL 客户端可以使用此URL直接PUT文件到腾讯云COS,无需经过服务器中转

【路径转换规则】 virtualPath 是完整的虚拟路径,格式为: /挂载点/子目录/文件名 例如: virtualPath = "/cos/aaa/123.jpg"

转换步骤(与 Upload 方法相同):

  1. 从 virtualPath 中减去 policy.VirtualPath(挂载点),得到相对路径 相对路径 = "/cos/aaa/123.jpg" - "/cos" = "/aaa/123.jpg"
  2. 将相对路径与 policy.BasePath(云存储基础路径)拼接 对象键 = "/test" + "/aaa/123.jpg" = "test/aaa/123.jpg"

func (*TencentCOSProvider) Delete added in v1.2.0

func (p *TencentCOSProvider) Delete(ctx context.Context, policy *model.StoragePolicy, sources []string) error

Delete 删除腾讯云COS中的文件 sources 是完整的对象键列表(如 "article_image_cos/logo.png"),已包含 basePath,无需再拼接

func (*TencentCOSProvider) DeleteDirectory added in v1.2.0

func (p *TencentCOSProvider) DeleteDirectory(ctx context.Context, policy *model.StoragePolicy, virtualPath string) error

DeleteDirectory 删除腾讯云COS中的"目录"

func (*TencentCOSProvider) DeleteWithPolicy added in v1.2.0

func (p *TencentCOSProvider) DeleteWithPolicy(ctx context.Context, policy *model.StoragePolicy, sources []string) error

DeleteWithPolicy 使用策略信息删除文件(扩展方法)

func (*TencentCOSProvider) Get added in v1.2.0

func (p *TencentCOSProvider) Get(ctx context.Context, policy *model.StoragePolicy, source string) (io.ReadCloser, error)

Get 从腾讯云COS获取文件流

func (*TencentCOSProvider) GetCORSConfig added in v1.2.0

GetCORSConfig 获取腾讯云COS存储桶的跨域配置

func (*TencentCOSProvider) GetDownloadURL added in v1.2.0

func (p *TencentCOSProvider) GetDownloadURL(ctx context.Context, policy *model.StoragePolicy, source string, options DownloadURLOptions) (string, error)

GetDownloadURL 根据存储策略权限设置生成腾讯云COS下载URL

func (*TencentCOSProvider) GetThumbnail added in v1.2.0

func (p *TencentCOSProvider) GetThumbnail(ctx context.Context, policy *model.StoragePolicy, source string, size string) (*ThumbnailResult, error)

GetThumbnail 腾讯云COS的数据万象服务支持实时图片处理,可以生成缩略图 如果用户在腾讯云控制台开通了数据万象服务,此功能将自动可用

func (*TencentCOSProvider) IsExist added in v1.2.0

func (p *TencentCOSProvider) IsExist(ctx context.Context, policy *model.StoragePolicy, source string) (bool, error)

IsExist 检查腾讯云COS中的对象是否存在

func (*TencentCOSProvider) IsExistWithPolicy added in v1.2.0

func (p *TencentCOSProvider) IsExistWithPolicy(ctx context.Context, policy *model.StoragePolicy, source string) (bool, error)

IsExistWithPolicy 使用策略信息检查对象是否存在(扩展方法)

func (*TencentCOSProvider) List added in v1.2.0

func (p *TencentCOSProvider) List(ctx context.Context, policy *model.StoragePolicy, virtualPath string) ([]FileInfo, error)

List 列出腾讯云COS存储桶中的对象

func (*TencentCOSProvider) Rename added in v1.2.0

func (p *TencentCOSProvider) Rename(ctx context.Context, policy *model.StoragePolicy, oldVirtualPath, newVirtualPath string) error

Rename 重命名或移动腾讯云COS中的对象 Rename 重命名或移动腾讯云COS中的文件或目录 oldVirtualPath 和 newVirtualPath 是相对于 policy.VirtualPath 的路径,需要通过 buildObjectKey 转换为完整对象键

func (*TencentCOSProvider) SetupCORS added in v1.2.0

func (p *TencentCOSProvider) SetupCORS(ctx context.Context, policy *model.StoragePolicy) error

SetupCORS 为腾讯云COS存储桶配置跨域策略 配置允许所有来源访问,支持GET, POST, PUT, DELETE, HEAD方法

func (*TencentCOSProvider) Stream added in v1.2.0

func (p *TencentCOSProvider) Stream(ctx context.Context, policy *model.StoragePolicy, source string, writer io.Writer) error

Stream 将腾讯云COS文件内容流式传输到写入器

func (*TencentCOSProvider) Upload added in v1.2.0

func (p *TencentCOSProvider) Upload(ctx context.Context, file io.Reader, policy *model.StoragePolicy, virtualPath string) (*UploadResult, error)

Upload 上传文件到腾讯云COS

【路径转换规则】 virtualPath 是完整的虚拟路径,格式为: /挂载点/子目录/文件名 例如: virtualPath = "/cos/aaa/123.jpg"

转换步骤:

  1. 从 virtualPath 中减去 policy.VirtualPath(挂载点),得到相对路径 相对路径 = "/cos/aaa/123.jpg" - "/cos" = "/aaa/123.jpg"
  2. 将相对路径与 policy.BasePath(云存储基础路径)拼接 对象键 = "/test" + "/aaa/123.jpg" = "test/aaa/123.jpg"

数据库 files 表的 name 字段存储的是相对于挂载点的路径(不含挂载点)

type ThumbnailResult

type ThumbnailResult struct {
	ContentType string
	Data        []byte
}

ThumbnailResult 封装了获取缩略图的结果

type UploadResult

type UploadResult struct {
	Source    string
	Size      int64
	MimeType  string
	Dimension string
}

UploadResult 封装了上传操作成功后的文件信息。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL