Documentation
¶
Overview ¶
Package gouploader 提供生产级文件上传工具包,适用于 Gin 框架。
功能特性:
- 普通单文件上传(流式传输,内存恒定)
- 分片上传,支持断点续传
- 秒传(基于文件哈希索引,需注入 HashStore)
- 云原生 Multipart 直传(需使用 aliyun/tencent/huawei 子 module 的 Storage 实现)
- STS 前端直传(客户端使用云厂商 JS SDK 直连云端)
- 可插拔存储:本地磁盘、S3 兼容(MinIO/AWS S3)、各云厂商(独立子 module)
- 文件完整性校验(MD5/SHA256)、并发安全、流式 I/O
快速开始(代理路径,最简):
uploader, err := gouploader.New(
gouploader.WithLocalStorage("./uploads"),
)
uploader.RegisterRoutes(r.Group("/api/v1/upload"))
生产场景(Multipart 直传 + 秒传 + 灰度):
import "github.com/gtkit/gouploader/aliyun"
ossStorage, _ := aliyun.NewStorage(aliyun.Config{...})
uploader, _ := gouploader.New(
gouploader.WithStorage(ossStorage),
gouploader.WithHashStore(myHashStore),
gouploader.WithMultipartThreshold(100 << 20),
gouploader.WithMultipartFeatureFlag(gradualRollout),
gouploader.WithOrphanCleanup(24*time.Hour, 1*time.Hour),
)
Example (Basic) ¶
Example_basic demonstrates the simplest usage with local storage.
package main
import (
"fmt"
"log"
"github.com/gin-gonic/gin"
"github.com/gtkit/gouploader"
)
func main() {
r := gin.Default()
uploader, err := gouploader.New(
gouploader.WithLocalStorage("./uploads"),
)
if err != nil {
log.Fatal(err)
}
uploader.RegisterRoutes(r.Group("/api/v1/upload"))
defer uploader.Close()
// r.Run(":8080")
fmt.Println("routes registered")
}
Output: routes registered
Example (CustomRoutes) ¶
Example_customRoutes demonstrates registering routes individually with custom middleware.
package main
import (
"fmt"
"log"
"github.com/gin-gonic/gin"
"github.com/gtkit/gouploader"
)
func main() {
r := gin.Default()
uploader, err := gouploader.New(
gouploader.WithLocalStorage("./uploads"),
)
if err != nil {
log.Fatal(err)
}
// Register routes individually with custom middleware.
auth := func(c *gin.Context) { c.Next() } // your auth middleware
v1 := r.Group("/api/v1", auth)
{
v1.POST("/upload", uploader.HandleUpload())
v1.POST("/upload/chunk/init", uploader.HandleChunkInit())
v1.POST("/upload/chunk", uploader.HandleChunkUpload())
v1.GET("/upload/chunk/status/:upload_id", uploader.HandleChunkStatus())
v1.POST("/upload/chunk/merge/:upload_id", uploader.HandleChunkMerge())
v1.DELETE("/upload/chunk/:upload_id", uploader.HandleChunkAbort())
}
fmt.Println("custom routes registered")
}
Output: custom routes registered
Example (S3) ¶
Example_s3 demonstrates using S3-compatible storage (MinIO/阿里云/腾讯云/华为云).
package main
import (
"fmt"
"log"
"github.com/gin-gonic/gin"
"github.com/gtkit/gouploader"
)
func main() {
r := gin.Default()
uploader, err := gouploader.New(
gouploader.WithS3Storage(gouploader.S3Config{
// MinIO:
// Endpoint: "127.0.0.1:9000",
// 阿里云 OSS:
// Endpoint: "oss-cn-hangzhou.aliyuncs.com",
// 腾讯云 COS:
// Endpoint: "cos.ap-guangzhou.myqcloud.com",
// 华为云 OBS:
// Endpoint: "obs.cn-north-4.myhuaweicloud.com",
Endpoint: "127.0.0.1:9000",
AccessKey: "minioadmin",
SecretKey: "minioadmin",
Bucket: "uploads",
Region: "us-east-1",
UseSSL: false,
}),
gouploader.WithMaxFileSize(10<<30), // 10GB
gouploader.WithChunkSize(
10<<20, // default: 10MB
1<<20, // min: 1MB
50<<20, // max: 50MB
),
)
if err != nil {
log.Fatal(err)
}
uploader.RegisterRoutes(r.Group("/api/v1/upload"))
fmt.Println("s3 routes registered")
}
Output:
Example (WithCallback) ¶
Example_withCallback demonstrates how to handle post-upload business logic.
package main
import (
"fmt"
"log"
"github.com/gin-gonic/gin"
"github.com/gtkit/gouploader"
)
func main() {
r := gin.Default()
uploader, err := gouploader.New(
gouploader.WithLocalStorage("./uploads"),
gouploader.WithMaxFileSize(2<<30), // 2GB
gouploader.WithAllowedTypes(".jpg", ".png", ".mp4", ".pdf"),
gouploader.WithHashAlgorithm("sha256"),
gouploader.WithOnUploadComplete(func(result *gouploader.UploadResult) {
// This callback fires after every successful upload.
// Use it to save metadata to your database, send notifications, etc.
log.Printf("file uploaded: %s -> %s (checksum: %s)",
result.FileName, result.StorageKey, result.Checksum)
}),
)
if err != nil {
log.Fatal(err)
}
uploader.RegisterRoutes(r.Group("/api/v1/upload"))
defer uploader.Close()
// r.Run(":8080")
fmt.Println("routes registered")
}
Output: routes registered
Index ¶
- Constants
- Variables
- func CORS(cfg CORSConfig) gin.HandlerFunc
- type AWSSTSConfig
- type AliyunSTSConfig
- type CORSConfig
- type ChunkCompleteRequest
- type ChunkInitRequest
- type ChunkInitResponse
- type ChunkStatusResponse
- type ChunkUploadResponse
- type CompleteResult
- type DirectCompleteRequest
- type DirectTokenRequest
- type DirectTokenResponse
- type DirectUploadResult
- type Error
- type HashStore
- type HashedFile
- type HuaweiSTSConfig
- type InstantHitEvent
- type MultipartMeta
- type MultipartStorage
- type Option
- func WithAWSSTS(cfg AWSSTSConfig) Option
- func WithAliyunSTS(cfg AliyunSTSConfig) Option
- func WithAllowedTypes(types ...string) Option
- func WithChunkCleanupInterval(interval time.Duration) Option
- func WithChunkSessionTTL(ttl time.Duration) Option
- func WithChunkSize(defaultSize, minSize, maxSize int64) Option
- func WithChunkTempDir(dir string) Option
- func WithHashAlgorithm(algo string) Option
- func WithHashStore(hs HashStore) Option
- func WithHashStoreRegisterTimeout(d time.Duration) Option
- func WithHuaweiSTS(cfg HuaweiSTSConfig) Option
- func WithLocalStorage(basePath string) Option
- func WithMaxFileSize(size int64) Option
- func WithMultipartDisabled() Option
- func WithMultipartFeatureFlag(fn func(ctx context.Context, ginCtx *gin.Context, req *ChunkInitRequest) bool) Option
- func WithMultipartKeyPrefix(fn func(c *gin.Context, userID string) string) Option
- func WithMultipartThreshold(bytes int64) Option
- func WithOnDirectUploadComplete(fn func(result *DirectUploadResult)) Option
- func WithOnInstantHit(fn func(ctx context.Context, ev *InstantHitEvent)) Option
- func WithOnUploadAbort(fn func(ctx context.Context, ev *UploadAbortEvent)) Option
- func WithOnUploadComplete(fn func(result *UploadResult)) Option
- func WithOnUploadError(fn func(ctx context.Context, ev *UploadErrorEvent)) Option
- func WithOnUploadInit(fn func(ctx context.Context, ev *UploadInitEvent)) Option
- func WithOrphanCleanup(ttl, interval time.Duration) Option
- func WithPartSignTTL(ttl time.Duration) Option
- func WithPublicURLBuilder(fn func(storageKey string) string) Option
- func WithS3Storage(s3 S3Config) Option
- func WithSTSKeyPrefix(fn func(c *gin.Context) string) Option
- func WithSTSProvider(p STSProvider) Option
- func WithStorage(s Storage) Option
- func WithTencentSTS(cfg TencentSTSConfig) Option
- func WithUserIDFn(fn func(c *gin.Context) string) Option
- type OrphanMultipart
- type PartETag
- type PartInfo
- type PartSignRequest
- type PartSignResponse
- type PresignPartRequest
- type ResumeRequest
- type ResumeResponse
- type S3Config
- type STSCredential
- type STSProvider
- type Storage
- type TencentSTSConfig
- type UploadAbortEvent
- type UploadErrorEvent
- type UploadInitEvent
- type UploadResult
- type Uploader
- func (u *Uploader) Close()
- func (u *Uploader) HandleChunkAbort() gin.HandlerFunc
- func (u *Uploader) HandleChunkComplete() gin.HandlerFunc
- func (u *Uploader) HandleChunkInit() gin.HandlerFunc
- func (u *Uploader) HandleChunkMerge() gin.HandlerFunc
- func (u *Uploader) HandleChunkReportPartETag() gin.HandlerFunc
- func (u *Uploader) HandleChunkResume() gin.HandlerFunc
- func (u *Uploader) HandleChunkSignParts() gin.HandlerFunc
- func (u *Uploader) HandleChunkStatus() gin.HandlerFunc
- func (u *Uploader) HandleChunkUpload() gin.HandlerFunc
- func (u *Uploader) HandleDirectCallback() gin.HandlerFunc
- func (u *Uploader) HandleDirectComplete() gin.HandlerFunc
- func (u *Uploader) HandleDirectToken() gin.HandlerFunc
- func (u *Uploader) HandleUpload() gin.HandlerFunc
- func (u *Uploader) RegisterRoutes(group *gin.RouterGroup)
Examples ¶
Constants ¶
const ( CodeFileTooLarge = types.CodeFileTooLarge // 文件超过大小限制 CodeFileTypeNotAllow = types.CodeFileTypeNotAllow // 文件类型不允许 CodeChecksumMismatch = types.CodeChecksumMismatch // 校验和不匹配 CodeFileReadError = types.CodeFileReadError // 文件读取错误 CodeInvalidParam = types.CodeInvalidParam // 参数无效 CodeMultipartError = types.CodeMultipartError // multipart 解析错误 CodeSessionNotFound = types.CodeSessionNotFound // 上传会话不存在 CodeSessionExpired = types.CodeSessionExpired // 上传会话已过期 CodeChunkIndexOutRange = types.CodeChunkIndexOutRange // 分片索引越界 CodeChunkDuplicate = types.CodeChunkDuplicate // 分片重复上传 CodeChunkHashMismatch = types.CodeChunkHashMismatch // 分片校验和不匹配 CodeMergeIncomplete = types.CodeMergeIncomplete // 分片未全部上传 CodeMergeHashFailed = types.CodeMergeHashFailed // 合并后校验失败 CodeStorageWriteFail = types.CodeStorageWriteFail // 存储写入失败 CodeStorageReadFail = types.CodeStorageReadFail // 存储读取失败 CodeStorageDeleteFail = types.CodeStorageDeleteFail // 存储删除失败 CodeSTSNotConfigured = types.CodeSTSNotConfigured // STS 未配置 CodeSTSIssueFailed = types.CodeSTSIssueFailed // STS 凭证签发失败 CodeCallbackVerifyFail = types.CodeCallbackVerifyFail // 回调验签失败 CodeDirectFileNotFound = types.CodeDirectFileNotFound // 直传文件不存在 CodeMultipartNotSupported = types.CodeMultipartNotSupported // 当前存储后端不支持 Multipart 直传 CodeMultipartInitFailed = types.CodeMultipartInitFailed // 云端 Multipart 初始化失败 CodeMultipartPresignFail = types.CodeMultipartPresignFail // 预签名 URL 生成失败 CodeMultipartCompleteFail = types.CodeMultipartCompleteFail // 云端 Multipart 合并失败 CodeMultipartAbortFail = types.CodeMultipartAbortFail // 云端 Multipart 中止失败 CodePartVerifyFail = types.CodePartVerifyFail // 服务端二次校验 parts 失败 CodePartETagMismatch = types.CodePartETagMismatch // 客户端上报 ETag 与云端不一致 )
错误码常量。
const ( StageInit = types.StageInit // 会话初始化阶段 StagePart = types.StagePart // 分片上传阶段 StageMerge = types.StageMerge // 代理路径合并阶段 StageComplete = types.StageComplete // Multipart 直传 Complete 阶段 StageAbort = types.StageAbort // 中止阶段 )
Stage 常量:UploadErrorEvent.Stage 字段的合法取值。 这些字符串值可直接作为 Prometheus label 使用。
const (
AbortReasonClientRequest = types.AbortReasonClientRequest
)
中止原因常量:UploadAbortEvent.Reason 字段的取值。
const Version = "v1.3.0"
Variables ¶
var ( ErrFileTooLarge = types.ErrFileTooLarge ErrFileTypeNotAllow = types.ErrFileTypeNotAllow ErrChecksumMismatch = types.ErrChecksumMismatch ErrInvalidParam = types.ErrInvalidParam ErrMultipartError = types.ErrMultipartError ErrSessionNotFound = types.ErrSessionNotFound ErrSessionExpired = types.ErrSessionExpired ErrChunkIndexOutRange = types.ErrChunkIndexOutRange ErrChunkHashMismatch = types.ErrChunkHashMismatch ErrMergeIncomplete = types.ErrMergeIncomplete ErrMergeHashFailed = types.ErrMergeHashFailed ErrStorageWrite = types.ErrStorageWrite ErrStorageRead = types.ErrStorageRead ErrStorageDelete = types.ErrStorageDelete ErrSTSNotConfigured = types.ErrSTSNotConfigured ErrSTSIssueFailed = types.ErrSTSIssueFailed ErrCallbackVerifyFail = types.ErrCallbackVerifyFail ErrDirectFileNotFound = types.ErrDirectFileNotFound ErrMultipartNotSupported = types.ErrMultipartNotSupported ErrMultipartInitFailed = types.ErrMultipartInitFailed ErrMultipartPresignFail = types.ErrMultipartPresignFail ErrMultipartCompleteFail = types.ErrMultipartCompleteFail ErrMultipartAbortFail = types.ErrMultipartAbortFail ErrPartVerifyFail = types.ErrPartVerifyFail ErrPartETagMismatch = types.ErrPartETagMismatch )
预定义错误。
Functions ¶
func CORS ¶
func CORS(cfg CORSConfig) gin.HandlerFunc
CORS 返回处理跨域请求的 Gin 中间件。
用法:
group := r.Group("/api/v1/upload")
group.Use(gouploader.CORS(gouploader.CORSConfig{
AllowOrigins: []string{"https://example.com"},
}))
uploader.RegisterRoutes(group)
Types ¶
type CORSConfig ¶
type CORSConfig struct {
// AllowOrigins 允许访问的源列表。
// 使用 "*" 允许所有源(不建议生产环境使用)。
AllowOrigins []string
// AllowHeaders 客户端可以发送的额外请求头。
// 默认请求头(Content-Type, X-Request-ID)始终包含。
AllowHeaders []string
// ExposeHeaders 客户端可以读取的额外响应头。
ExposeHeaders []string
// AllowCredentials 是否允许携带凭据(Cookie 等)。
AllowCredentials bool
// MaxAge 预检请求结果的缓存时间(秒)。默认 86400(24小时)。
MaxAge int
}
CORSConfig 跨域资源共享配置。
type ChunkCompleteRequest ¶ added in v1.2.0
type ChunkCompleteRequest = types.ChunkCompleteRequest
ChunkCompleteRequest Multipart 直传路径的合并请求体。
type ChunkInitRequest ¶
type ChunkInitRequest = types.ChunkInitRequest
ChunkInitRequest 初始化分片上传的 JSON 请求体。
type ChunkInitResponse ¶
type ChunkInitResponse = types.ChunkInitResponse
ChunkInitResponse 分片上传会话创建后的响应。
type ChunkStatusResponse ¶
type ChunkStatusResponse = types.ChunkStatusResponse
ChunkStatusResponse 查询分片上传状态的响应。
type ChunkUploadResponse ¶
type ChunkUploadResponse = types.ChunkUploadResponse
ChunkUploadResponse 单个分片上传后的响应。
type CompleteResult ¶ added in v1.2.0
type CompleteResult = types.CompleteResult
CompleteResult Multipart 合并结果。
type DirectCompleteRequest ¶
type DirectCompleteRequest = types.DirectCompleteRequest
DirectCompleteRequest 前端确认上传完成的请求体。
type DirectTokenRequest ¶
type DirectTokenRequest = types.DirectTokenRequest
DirectTokenRequest 请求 STS 凭证的请求体。
type DirectTokenResponse ¶
type DirectTokenResponse = types.DirectTokenResponse
DirectTokenResponse STS 凭证响应。
type DirectUploadResult ¶
type DirectUploadResult = types.DirectUploadResult
DirectUploadResult 前端直传完成后的结果。
type InstantHitEvent ¶ added in v1.2.0
type InstantHitEvent = types.InstantHitEvent
InstantHitEvent 秒传命中时触发的生命周期钩子 payload。
type MultipartMeta ¶ added in v1.2.0
type MultipartMeta = types.MultipartMeta
MultipartMeta 创建 Multipart 时可设置的对象元数据。
type MultipartStorage ¶ added in v1.2.0
type MultipartStorage = types.MultipartStorage
MultipartStorage 是支持云原生 Multipart 直传的存储扩展接口。 由各云厂商 adapter 子 module 实现(aliyun / tencent / huawei)。
type Option ¶
type Option func(*config)
Option 用于配置 Uploader。
func WithAllowedTypes ¶
WithAllowedTypes 设置允许的文件扩展名(如 ".jpg", ".png", ".mp4")。 空列表表示允许所有类型。
func WithChunkCleanupInterval ¶
WithChunkCleanupInterval 设置过期会话的清理间隔。 interval 必须为正数,否则 panic。
func WithChunkSessionTTL ¶
WithChunkSessionTTL 设置分片上传会话的过期时间。
func WithChunkSize ¶
WithChunkSize 设置默认、最小和最大分片大小。
func WithHashAlgorithm ¶
WithHashAlgorithm 设置校验和算法("md5" 或 "sha256")。
func WithHashStore ¶ added in v1.2.0
WithHashStore 注入秒传索引存储。nil 时秒传功能关闭。
典型用法:
type dbHashStore struct{ db *gorm.DB }
func (s *dbHashStore) LookupByHash(ctx, algo, hash) (*HashedFile, error) { ... }
func (s *dbHashStore) Register(ctx, entry *HashedFile) error { ... }
gouploader.WithHashStore(&dbHashStore{db: db})
func WithHashStoreRegisterTimeout ¶ added in v1.3.0
WithHashStoreRegisterTimeout 设置 HashStore.Register 异步注册的最大等待时长。 默认 30 秒。HashStore 实现卡死时,此超时防止后台 goroutine 无限累积。 业务方根据下游存储 SLA 自行调整(如 Redis 一般 100ms,MySQL 写入一般 1-2s)。
func WithMultipartDisabled ¶ added in v1.2.0
func WithMultipartDisabled() Option
WithMultipartDisabled 强制关闭 Multipart 直传路径,所有大文件都走代理合并。 用于灰度回滚或调试。默认启用(前提是 Storage 实现了 MultipartStorage 接口)。
func WithMultipartFeatureFlag ¶ added in v1.2.0
func WithMultipartFeatureFlag(fn func(ctx context.Context, ginCtx *gin.Context, req *ChunkInitRequest) bool) Option
WithMultipartFeatureFlag 注入 Feature Flag 钩子,按请求动态决定是否走 Multipart 路径。 典型用法:灰度发布 / 按用户 ID hash / 按 bucket 分流。
gouploader.WithMultipartFeatureFlag(func(ctx, ginCtx, req) bool {
uid := ginCtx.GetString("user_id")
return hashMod(uid) < 10 // 10% 灰度
})
func WithMultipartKeyPrefix ¶ added in v1.2.0
WithMultipartKeyPrefix 生成 Multipart 路径下的对象键前缀。 默认按日期生成 "{year}/{month}/{day}/"。
典型用法(按用户隔离):
gouploader.WithMultipartKeyPrefix(func(c, userID) string {
return fmt.Sprintf("user-%s/%s/", userID, time.Now().Format("2006-01-02"))
})
func WithMultipartThreshold ¶ added in v1.2.0
WithMultipartThreshold 设置走 Multipart 直传的最小文件大小(字节)。 小于此阈值的文件强制走代理路径——省掉签名开销。默认 100MB。
func WithOnDirectUploadComplete ¶
func WithOnDirectUploadComplete(fn func(result *DirectUploadResult)) Option
WithOnDirectUploadComplete 注册直传完成后的回调。 在 Complete 或 Callback 确认文件上传成功后触发。
func WithOnInstantHit ¶ added in v1.2.0
func WithOnInstantHit(fn func(ctx context.Context, ev *InstantHitEvent)) Option
WithOnInstantHit 注册秒传命中钩子。 用于统计命中率、节省流量等业务指标。 仅在 HashStore 配置且 LookupByHash 返回非 nil 时触发。
func WithOnUploadAbort ¶ added in v1.2.0
func WithOnUploadAbort(fn func(ctx context.Context, ev *UploadAbortEvent)) Option
WithOnUploadAbort 注册上传中止钩子。 触发时机:客户端 DELETE /chunk/:id 清理完 session 后(云端 Multipart 也已 Abort)。
func WithOnUploadComplete ¶
func WithOnUploadComplete(fn func(result *UploadResult)) Option
WithOnUploadComplete 注册上传完成后的回调函数。 每次上传成功后触发(包括普通上传和分片合并)。 可用于保存数据库、发送通知等业务逻辑。
func WithOnUploadError ¶ added in v1.2.0
func WithOnUploadError(fn func(ctx context.Context, ev *UploadErrorEvent)) Option
WithOnUploadError 注册上传阶段失败钩子。 触发阶段见 Stage 常量:StageInit / StagePart / StageMerge / StageComplete / StageAbort。
func WithOnUploadInit ¶ added in v1.2.0
func WithOnUploadInit(fn func(ctx context.Context, ev *UploadInitEvent)) Option
WithOnUploadInit 注册上传会话初始化成功钩子。 触发时机:InitiateMultipart(云端)或本地 session 创建成功后。 秒传命中时不触发此钩子,改为触发 WithOnInstantHit。
func WithOrphanCleanup ¶ added in v1.2.0
WithOrphanCleanup 启用悬挂 Multipart 清理 worker。 ttl: 超过此时长未完成的 Multipart 视为悬挂,会被 Abort。默认 24h。 interval: 清理 worker 扫描间隔。默认 1h。
注意:此功能需要 Storage 实现 MultipartStorage 接口(包含 ListOrphans / AbortMultipart)。 建议同时在 bucket 层面配置 AbortIncompleteMultipartUpload 生命周期规则做双保险。
func WithPartSignTTL ¶ added in v1.2.0
WithPartSignTTL 设置单个 part 预签名 URL 的有效期。默认 15 分钟。 太短会导致网络慢的客户端 URL 过期,太长会扩大 URL 泄漏的爆炸半径。
func WithPublicURLBuilder ¶ added in v1.3.0
WithPublicURLBuilder 注入"对外可见 URL"拼装策略。
配置后,所有上传完成路径返回的 result(UploadResult / DirectUploadResult)的 URL 字段会被填充为 builder(storageKey) 的输出。覆盖路径:
- 普通上传 POST /
- 代理分片合并 POST /chunk/merge/:upload_id
- Multipart 直传合并 POST /chunk/complete
- 秒传命中 POST /chunk/init
- STS 直传 POST /direct/complete
- STS 直传回调 POST /direct/callback
builder 应保持轻量(纯字符串拼接),避免阻塞主上传流程。 builder 内 panic 被 recover 隔离,不影响上传;但 URL 字段会为空字符串。
典型用法(CDN 前缀拼接):
gouploader.WithPublicURLBuilder(func(key string) string {
return "https://static.example.com/" + key
})
私有 bucket 临时访问 URL 示例(业务方自行调云 SDK 签名):
gouploader.WithPublicURLBuilder(func(key string) string {
url, _ := storage.GetSignedGetURL(context.Background(), key, 15*time.Minute)
return url
})
不配置 / 设为 nil 时,所有 result.URL 字段为空,JSON 因 omitempty 不输出, 行为等价于未引入此特性的旧版本。
func WithSTSKeyPrefix ¶
WithSTSKeyPrefix 设置生成 keyPrefix 的函数。 默认按日期生成,如 "direct/2026/04/09/"。 可用于按用户 ID 隔离:func(c *gin.Context) string { return "user-" + getUserID(c) + "/" }
func WithSTSProvider ¶
func WithSTSProvider(p STSProvider) Option
WithSTSProvider 设置自定义 STS Provider 实现。
func WithStorage ¶
WithStorage 设置自定义 Storage 实现。 会覆盖 WithLocalStorage 和 WithS3Storage。
func WithTencentSTS ¶
func WithTencentSTS(cfg TencentSTSConfig) Option
WithTencentSTS 配置腾讯云 COS STS 直传。
type OrphanMultipart ¶ added in v1.2.0
type OrphanMultipart = types.OrphanMultipart
OrphanMultipart 悬挂 Multipart 元信息。
type PartSignRequest ¶ added in v1.2.0
type PartSignRequest = types.PartSignRequest
PartSignRequest 按需签名请求体。
type PartSignResponse ¶ added in v1.2.0
type PartSignResponse = types.PartSignResponse
PartSignResponse 按需签名响应。
type PresignPartRequest ¶ added in v1.2.0
type PresignPartRequest = types.PresignPartRequest
PresignPartRequest 预签名单片请求。
type ResumeRequest ¶ added in v1.2.0
type ResumeRequest = types.ResumeRequest
ResumeRequest 秒传 + 断点续传查询请求体。
type ResumeResponse ¶ added in v1.2.0
type ResumeResponse = types.ResumeResponse
ResumeResponse 秒传 + 断点续传查询响应。
type S3Config ¶
type S3Config struct {
Endpoint string
AccessKey string
SecretKey string
Bucket string
Region string
UseSSL bool
}
S3Config 包含 S3 兼容对象存储的连接参数。
Endpoint 示例:
MinIO: "127.0.0.1:9000" 阿里云 OSS: "oss-cn-hangzhou.aliyuncs.com" 腾讯云 COS: "cos.ap-guangzhou.myqcloud.com" 华为云 OBS: "obs.cn-north-4.myhuaweicloud.com" AWS S3: "s3.us-east-1.amazonaws.com"
type Storage ¶
Storage 抽象文件持久化层。 所有方法均使用 io.Reader 流式传输,不会将完整文件缓冲到内存。
内置实现:本地磁盘、S3 兼容(MinIO/阿里云/腾讯云/华为云/AWS)。 也可通过 WithStorage 选项提供自定义实现。
type UploadAbortEvent ¶ added in v1.2.0
type UploadAbortEvent = types.UploadAbortEvent
UploadAbortEvent 会话被中止时触发的生命周期钩子 payload。
type UploadErrorEvent ¶ added in v1.2.0
type UploadErrorEvent = types.UploadErrorEvent
UploadErrorEvent 任一上传阶段失败时触发的生命周期钩子 payload。
type UploadInitEvent ¶ added in v1.2.0
type UploadInitEvent = types.UploadInitEvent
UploadInitEvent 会话初始化成功时触发的生命周期钩子 payload。
type Uploader ¶
type Uploader struct {
// contains filtered or unexported fields
}
Uploader 是 gouploader 包的主入口。
func (*Uploader) Close ¶
func (u *Uploader) Close()
Close 释放 Uploader 持有的资源(停止后台清理协程)。 在 Uploader 不再使用或应用关闭时必须调用。
func (*Uploader) HandleChunkAbort ¶
func (u *Uploader) HandleChunkAbort() gin.HandlerFunc
HandleChunkAbort 返回中止分片上传的 Gin 处理函数。
func (*Uploader) HandleChunkComplete ¶ added in v1.2.0
func (u *Uploader) HandleChunkComplete() gin.HandlerFunc
HandleChunkComplete 返回 Multipart 路径合并的 Gin 处理函数。
func (*Uploader) HandleChunkInit ¶
func (u *Uploader) HandleChunkInit() gin.HandlerFunc
HandleChunkInit 返回分片上传初始化的 Gin 处理函数。
func (*Uploader) HandleChunkMerge ¶
func (u *Uploader) HandleChunkMerge() gin.HandlerFunc
HandleChunkMerge 返回合并分片的 Gin 处理函数。
func (*Uploader) HandleChunkReportPartETag ¶ added in v1.2.0
func (u *Uploader) HandleChunkReportPartETag() gin.HandlerFunc
HandleChunkReportPartETag 返回 Multipart 路径下客户端上报 ETag 的 Gin 处理函数。
func (*Uploader) HandleChunkResume ¶ added in v1.2.0
func (u *Uploader) HandleChunkResume() gin.HandlerFunc
HandleChunkResume 返回秒传 + 断点续传查询的 Gin 处理函数。
func (*Uploader) HandleChunkSignParts ¶ added in v1.2.0
func (u *Uploader) HandleChunkSignParts() gin.HandlerFunc
HandleChunkSignParts 返回按需签发分片预签名 URL 的 Gin 处理函数。
func (*Uploader) HandleChunkStatus ¶
func (u *Uploader) HandleChunkStatus() gin.HandlerFunc
HandleChunkStatus 返回查询分片上传状态的 Gin 处理函数。
func (*Uploader) HandleChunkUpload ¶
func (u *Uploader) HandleChunkUpload() gin.HandlerFunc
HandleChunkUpload 返回分片上传的 Gin 处理函数。
func (*Uploader) HandleDirectCallback ¶
func (u *Uploader) HandleDirectCallback() gin.HandlerFunc
HandleDirectCallback 返回云存储回调的 Gin 处理函数。
func (*Uploader) HandleDirectComplete ¶
func (u *Uploader) HandleDirectComplete() gin.HandlerFunc
HandleDirectComplete 返回前端确认上传完成的 Gin 处理函数。
func (*Uploader) HandleDirectToken ¶
func (u *Uploader) HandleDirectToken() gin.HandlerFunc
HandleDirectToken 返回签发 STS 凭证的 Gin 处理函数。
func (*Uploader) HandleUpload ¶
func (u *Uploader) HandleUpload() gin.HandlerFunc
HandleUpload 返回普通上传的 Gin 处理函数。 用于手动注册路由(搭配自定义中间件)。
func (*Uploader) RegisterRoutes ¶
func (u *Uploader) RegisterRoutes(group *gin.RouterGroup)
RegisterRoutes 在给定的 Gin 路由组上注册所有上传接口。
基础路由(始终注册):
POST {group}/ - 普通单文件上传
POST {group}/chunk/init - 初始化分片上传(自动探测 proxy / multipart / instant)
POST {group}/chunk - [proxy] 上传单个分片
GET {group}/chunk/status/:upload_id - 查询上传进度(断点续传)
POST {group}/chunk/merge/:upload_id - [proxy] 合并所有分片
DELETE {group}/chunk/:upload_id - 中止上传(同时 Abort 云端 Multipart)
POST {group}/chunk/resume - 秒传 + 断点续传查询
POST {group}/chunk/parts/sign - [multipart] 按需签发分片预签名 URL
POST {group}/chunk/parts/report - [multipart] 客户端上报单片 ETag
POST {group}/chunk/complete - [multipart] 合并(携带 parts + ETag 列表)
STS 直传路由(仅当配置了 STS Provider 时注册):
POST {group}/direct/token - 签发 STS 临时凭证
POST {group}/direct/callback - 云存储上传完成回调
POST {group}/direct/complete - 前端确认上传完成