mirror of https://github.com/cloudreve/Cloudreve
Feat: download file / speed limit in oss policy
parent
dd198becce
commit
286f76cbec
|
@ -135,6 +135,7 @@ func NewAnonymousFileSystem() (*FileSystem, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// dispatchHandler 根据存储策略分配文件适配器
|
// dispatchHandler 根据存储策略分配文件适配器
|
||||||
|
// TODO 完善测试
|
||||||
func (fs *FileSystem) dispatchHandler() error {
|
func (fs *FileSystem) dispatchHandler() error {
|
||||||
var policyType string
|
var policyType string
|
||||||
var currentPolicy *model.Policy
|
var currentPolicy *model.Policy
|
||||||
|
|
|
@ -92,7 +92,55 @@ func (handler Handler) Source(
|
||||||
isDownload bool,
|
isDownload bool,
|
||||||
speed int,
|
speed int,
|
||||||
) (string, error) {
|
) (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
|
// Token 获取上传策略和认证Token
|
||||||
|
|
Loading…
Reference in New Issue