diff --git a/pkg/filemanager/driver/cos/cos.go b/pkg/filemanager/driver/cos/cos.go index 89e83880..b87e3eee 100644 --- a/pkg/filemanager/driver/cos/cos.go +++ b/pkg/filemanager/driver/cos/cos.go @@ -352,6 +352,14 @@ func (handler Driver) Thumb(ctx context.Context, expire *time.Time, ext string, w, h := handler.settings.ThumbSize(ctx) thumbParam := fmt.Sprintf("imageMogr2/thumbnail/%dx%d", w, h) + enco := handler.settings.ThumbEncode(ctx) + switch enco.Format { + case "jpg", "webp": + thumbParam += fmt.Sprintf("/format/%s/rquality/%d", enco.Format, enco.Quality) + case "png": + thumbParam += fmt.Sprintf("/format/%s", enco.Format) + } + source, err := handler.signSourceURL( ctx, e.Source(), diff --git a/pkg/filemanager/driver/ks3/ks3.go b/pkg/filemanager/driver/ks3/ks3.go index e1ffdf40..6e2b008f 100644 --- a/pkg/filemanager/driver/ks3/ks3.go +++ b/pkg/filemanager/driver/ks3/ks3.go @@ -298,7 +298,48 @@ func (handler *Driver) Delete(ctx context.Context, files ...string) ([]string, e // Thumb 获取缩略图URL func (handler *Driver) Thumb(ctx context.Context, expire *time.Time, ext string, e fs.Entity) (string, error) { - return "", errors.New("not implemented") + w, h := handler.settings.ThumbSize(ctx) + thumbParam := fmt.Sprintf("@base@tag=imgScale&m=0&w=%d&h=%d", w, h) + + enco := handler.settings.ThumbEncode(ctx) + switch enco.Format { + case "jpg", "webp": + thumbParam += fmt.Sprintf("&q=%d&F=%s", enco.Quality, enco.Format) + case "png": + thumbParam += fmt.Sprintf("&F=%s", enco.Format) + } + + // 确保过期时间不小于 0 ,如果小于则设置为 7 天 + var ttl int64 + if expire != nil { + ttl = int64(time.Until(*expire).Seconds()) + } else { + ttl = 604800 + } + + thumbUrl, err := handler.svc.GeneratePresignedUrl(&s3.GeneratePresignedUrlInput{ + HTTPMethod: s3.GET, // 请求方法 + Bucket: &handler.policy.BucketName, // 存储空间名称 + Key: aws.String(e.Source()+thumbParam), // 对象的key + Expires: ttl, // 过期时间,转换为秒数 + }) + + if err != nil { + return "", err + } + + // 将最终生成的签名URL域名换成用户自定义的加速域名(如果有) + finalThumbURL, err := url.Parse(thumbUrl) + if err != nil { + return "", err + } + + // 公有空间替换掉Key及不支持的头 + if !handler.policy.IsPrivate { + finalThumbURL.RawQuery = "" + } + + return finalThumbURL.String(), nil } // Source 获取文件外链 diff --git a/pkg/filemanager/driver/obs/obs.go b/pkg/filemanager/driver/obs/obs.go index 4dadfcf7..a9fc9137 100644 --- a/pkg/filemanager/driver/obs/obs.go +++ b/pkg/filemanager/driver/obs/obs.go @@ -335,13 +335,23 @@ func (d *Driver) LocalPath(ctx context.Context, path string) string { func (d *Driver) Thumb(ctx context.Context, expire *time.Time, ext string, e fs.Entity) (string, error) { w, h := d.settings.ThumbSize(ctx) + thumbParam := fmt.Sprintf("image/resize,m_lfit,w_%d,h_%d", w, h) + + enco := d.settings.ThumbEncode(ctx) + switch enco.Format { + case "jpg", "webp": + thumbParam += fmt.Sprintf("/format,%s/quality,q_%d", enco.Format, enco.Quality) + case "png": + thumbParam += fmt.Sprintf("/format,%s", enco.Format) + } + thumbURL, err := d.signSourceURL(&obs.CreateSignedUrlInput{ Method: obs.HttpMethodGet, Bucket: d.policy.BucketName, Key: e.Source(), Expires: int(time.Until(*expire).Seconds()), QueryParams: map[string]string{ - imageProcessHeader: fmt.Sprintf("image/resize,m_lfit,w_%d,h_%d", w, h), + imageProcessHeader: thumbParam, }, }) diff --git a/pkg/filemanager/driver/oss/oss.go b/pkg/filemanager/driver/oss/oss.go index 5575e7be..b2d2c0a7 100644 --- a/pkg/filemanager/driver/oss/oss.go +++ b/pkg/filemanager/driver/oss/oss.go @@ -334,6 +334,15 @@ func (handler *Driver) Thumb(ctx context.Context, expire *time.Time, ext string, w, h := handler.settings.ThumbSize(ctx) thumbParam := fmt.Sprintf("image/resize,m_lfit,h_%d,w_%d", h, w) + + enco := handler.settings.ThumbEncode(ctx) + switch enco.Format { + case "jpg", "webp": + thumbParam += fmt.Sprintf("/format,%s/quality,q_%d", enco.Format, enco.Quality) + case "png": + thumbParam += fmt.Sprintf("/format,%s", enco.Format) + } + thumbOption := []oss.Option{oss.Process(thumbParam)} thumbURL, err := handler.signSourceURL( ctx, diff --git a/pkg/filemanager/driver/qiniu/qiniu.go b/pkg/filemanager/driver/qiniu/qiniu.go index d6dad012..bc185c1f 100644 --- a/pkg/filemanager/driver/qiniu/qiniu.go +++ b/pkg/filemanager/driver/qiniu/qiniu.go @@ -277,10 +277,20 @@ func (handler *Driver) Delete(ctx context.Context, files ...string) ([]string, e // Thumb 获取文件缩略图 func (handler *Driver) Thumb(ctx context.Context, expire *time.Time, ext string, e fs.Entity) (string, error) { w, h := handler.settings.ThumbSize(ctx) + thumbParam := fmt.Sprintf("imageView2/1/w/%d/h/%d", w, h) + + enco := handler.settings.ThumbEncode(ctx) + switch enco.Format { + case "jpg", "webp": + thumbParam += fmt.Sprintf("/format/%s/q/%d", enco.Format, enco.Quality) + case "png": + thumbParam += fmt.Sprintf("/format/%s", enco.Format) + } + return handler.signSourceURL( e.Source(), url.Values{ - fmt.Sprintf("imageView2/1/w/%d/h/%d", w, h): []string{}, + thumbParam: []string{}, }, expire, ), nil diff --git a/pkg/filemanager/driver/upyun/upyun.go b/pkg/filemanager/driver/upyun/upyun.go index 35fe5e7d..f0a5e5b3 100644 --- a/pkg/filemanager/driver/upyun/upyun.go +++ b/pkg/filemanager/driver/upyun/upyun.go @@ -203,8 +203,16 @@ func (handler *Driver) Delete(ctx context.Context, files ...string) ([]string, e // Thumb 获取文件缩略图 func (handler *Driver) Thumb(ctx context.Context, expire *time.Time, ext string, e fs.Entity) (string, error) { w, h := handler.settings.ThumbSize(ctx) - thumbParam := fmt.Sprintf("!/fwfh/%dx%d", w, h) + + enco := handler.settings.ThumbEncode(ctx) + switch enco.Format { + case "jpg", "webp": + thumbParam += fmt.Sprintf("/format/%s/quality/%d", enco.Format, enco.Quality) + case "png": + thumbParam += fmt.Sprintf("/format/%s", enco.Format) + } + thumbURL, err := handler.signURL(ctx, e.Source()+thumbParam, nil, expire) if err != nil { return "", err diff --git a/pkg/filemanager/manager/thumbnail.go b/pkg/filemanager/manager/thumbnail.go index 78e3f3e2..8a4559d8 100644 --- a/pkg/filemanager/manager/thumbnail.go +++ b/pkg/filemanager/manager/thumbnail.go @@ -185,9 +185,8 @@ func (m *manager) generateThumb(ctx context.Context, uri *fs.URI, ext string, es Uri: uri, Size: fileInfo.Size(), SavePath: fmt.Sprintf( - "%s.%s%s", + "%s%s", es.Entity().Source(), - util.RandStringRunes(16), m.settings.ThumbEntitySuffix(ctx), ), MimeType: m.dep.MimeDetector(ctx).TypeByName("thumb.jpg"),