From 286f76cbec76b3a3804a82a3c8f37c8b1be7177c Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Thu, 16 Jan 2020 14:28:35 +0800 Subject: [PATCH] Feat: download file / speed limit in oss policy --- pkg/filesystem/filesystem.go | 1 + pkg/filesystem/oss/handller.go | 50 +++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/pkg/filesystem/filesystem.go b/pkg/filesystem/filesystem.go index 906b712..e418f13 100644 --- a/pkg/filesystem/filesystem.go +++ b/pkg/filesystem/filesystem.go @@ -135,6 +135,7 @@ func NewAnonymousFileSystem() (*FileSystem, error) { } // dispatchHandler 根据存储策略分配文件适配器 +// TODO 完善测试 func (fs *FileSystem) dispatchHandler() error { var policyType string var currentPolicy *model.Policy diff --git a/pkg/filesystem/oss/handller.go b/pkg/filesystem/oss/handller.go index 43689f7..3413b6d 100644 --- a/pkg/filesystem/oss/handller.go +++ b/pkg/filesystem/oss/handller.go @@ -92,7 +92,55 @@ func (handler Handler) Source( isDownload bool, speed int, ) (string, error) { - return "", errors.New("未实现") + // 初始化客户端 + if err := handler.InitOSSClient(); err != nil { + return "", err + } + + // 尝试从上下文获取文件名 + fileName := "" + if file, ok := ctx.Value(fsctx.FileModelCtx).(model.File); ok { + fileName = file.Name + } + + // 添加各项设置 + var signOptions = make([]oss.Option, 0, 2) + if isDownload { + signOptions = append(signOptions, oss.ResponseContentDisposition("attachment; filename=\""+url.PathEscape(fileName)+"\"")) + } + if speed > 0 { + // OSS对速度值有范围限制 + if speed < 819200 { + speed = 819200 + } + if speed > 838860800 { + speed = 838860800 + } + signOptions = append(signOptions, oss.TrafficLimitParam(int64(speed))) + } + + return handler.signSourceURL(ctx, path, ttl, signOptions) +} + +func (handler Handler) signSourceURL(ctx context.Context, path string, ttl int64, options []oss.Option) (string, error) { + signedURL, err := handler.bucket.SignURL(path, oss.HTTPGet, ttl, options...) + if err != nil { + return "", err + } + + // 将最终生成的签名URL域名换成用户自定义的加速域名(如果有) + finalURL, err := url.Parse(signedURL) + if err != nil { + return "", err + } + cdnURL, err := url.Parse(handler.Policy.BaseURL) + if err != nil { + return "", err + } + finalURL.Host = cdnURL.Host + finalURL.Scheme = cdnURL.Scheme + + return finalURL.String(), nil } // Token 获取上传策略和认证Token