mirror of
				https://github.com/cloudreve/cloudreve.git
				synced 2025-11-04 04:47:24 +08:00 
			
		
		
		
	Feat: download file / speed limit in oss policy
This commit is contained in:
		@ -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
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user