Feat: get thumb & download file in qiniu policy

pull/247/head
HFO4 5 years ago
parent 534e127f87
commit 7fbbcefc57

@ -19,4 +19,6 @@ const (
UploadPolicyCtx UploadPolicyCtx
// UserCtx 用户 // UserCtx 用户
UserCtx UserCtx
// ThumbSizeCtx 缩略图尺寸
ThumbSizeCtx
) )

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
model "github.com/HFO4/cloudreve/models" model "github.com/HFO4/cloudreve/models"
"github.com/HFO4/cloudreve/pkg/conf" "github.com/HFO4/cloudreve/pkg/conf"
"github.com/HFO4/cloudreve/pkg/filesystem/fsctx"
"github.com/HFO4/cloudreve/pkg/filesystem/response" "github.com/HFO4/cloudreve/pkg/filesystem/response"
"github.com/HFO4/cloudreve/pkg/thumb" "github.com/HFO4/cloudreve/pkg/thumb"
"github.com/HFO4/cloudreve/pkg/util" "github.com/HFO4/cloudreve/pkg/util"
@ -28,6 +29,8 @@ func (fs *FileSystem) GetThumb(ctx context.Context, id uint) (*response.ContentR
}, ErrObjectNotExist }, ErrObjectNotExist
} }
w, h := fs.GenerateThumbnailSize(0, 0)
ctx = context.WithValue(ctx, fsctx.ThumbSizeCtx, [2]uint{w, h})
res, err := fs.Handler.Thumb(ctx, fs.FileTarget[0].SourceName) res, err := fs.Handler.Thumb(ctx, fs.FileTarget[0].SourceName)
// TODO 出错时重新生成缩略图 // TODO 出错时重新生成缩略图

@ -7,6 +7,7 @@ import (
"github.com/HFO4/cloudreve/pkg/serializer" "github.com/HFO4/cloudreve/pkg/serializer"
"github.com/HFO4/cloudreve/pkg/util" "github.com/HFO4/cloudreve/pkg/util"
"path" "path"
"strings"
) )
/* ================= /* =================
@ -322,6 +323,9 @@ func (fs *FileSystem) CreateDirectory(ctx context.Context, fullPath string) erro
base := path.Dir(fullPath) base := path.Dir(fullPath)
dir := path.Base(fullPath) dir := path.Base(fullPath)
// 去掉结尾空格
dir = strings.TrimRight(dir, " ")
// 检查目录名是否合法 // 检查目录名是否合法
if !fs.ValidateLegalName(ctx, dir) { if !fs.ValidateLegalName(ctx, dir) {
return ErrIllegalObjectName return ErrIllegalObjectName

@ -3,6 +3,7 @@ package qiniu
import ( import (
"context" "context"
"errors" "errors"
"fmt"
model "github.com/HFO4/cloudreve/models" model "github.com/HFO4/cloudreve/models"
"github.com/HFO4/cloudreve/pkg/filesystem/fsctx" "github.com/HFO4/cloudreve/pkg/filesystem/fsctx"
"github.com/HFO4/cloudreve/pkg/filesystem/response" "github.com/HFO4/cloudreve/pkg/filesystem/response"
@ -11,6 +12,7 @@ import (
"github.com/qiniu/api.v7/v7/storage" "github.com/qiniu/api.v7/v7/storage"
"io" "io"
"net/url" "net/url"
"time"
) )
// Handler 本地策略适配器 // Handler 本地策略适配器
@ -61,7 +63,23 @@ func (handler Handler) Delete(ctx context.Context, files []string) ([]string, er
// Thumb 获取文件缩略图 // Thumb 获取文件缩略图
func (handler Handler) Thumb(ctx context.Context, path string) (*response.ContentResponse, error) { func (handler Handler) Thumb(ctx context.Context, path string) (*response.ContentResponse, error) {
return nil, errors.New("未实现") var (
thumbSize = [2]uint{400, 300}
ok = false
)
if thumbSize, ok = ctx.Value(fsctx.ThumbSizeCtx).([2]uint); !ok {
return nil, errors.New("无法获取缩略图尺寸设置")
}
path = fmt.Sprintf("%s?imageView2/1/w/%d/h/%d", path, thumbSize[0], thumbSize[1])
return &response.ContentResponse{
Redirect: true,
URL: handler.signSourceURL(
ctx,
path,
int64(model.GetIntSetting("preview_timeout", 60)),
),
}, nil
} }
// Source 获取外链URL // Source 获取外链URL
@ -73,7 +91,31 @@ func (handler Handler) Source(
isDownload bool, isDownload bool,
speed int, speed int,
) (string, error) { ) (string, error) {
return "", errors.New("未实现") // 尝试从上下文获取文件名
fileName := ""
if file, ok := ctx.Value(fsctx.FileModelCtx).(model.File); ok {
fileName = file.Name
}
// 加入下载相关设置
if isDownload {
path = path + "?attname=" + url.PathEscape(fileName)
}
// 取得原始文件地址
return handler.signSourceURL(ctx, path, ttl), nil
}
func (handler Handler) signSourceURL(ctx context.Context, path string, ttl int64) string {
var sourceURL string
if handler.Policy.IsPrivate {
mac := qbox.NewMac(handler.Policy.AccessKey, handler.Policy.SecretKey)
deadline := time.Now().Add(time.Second * time.Duration(ttl)).Unix()
sourceURL = storage.MakePrivateURL(mac, handler.Policy.BaseURL, path, deadline)
} else {
sourceURL = storage.MakePublicURL(handler.Policy.BaseURL, path)
}
return sourceURL
} }
// Token 获取上传策略和认证Token // Token 获取上传策略和认证Token

@ -174,7 +174,7 @@ func (handler Handler) Delete(ctx context.Context, files []string) ([]string, er
func (handler Handler) Thumb(ctx context.Context, path string) (*response.ContentResponse, error) { func (handler Handler) Thumb(ctx context.Context, path string) (*response.ContentResponse, error) {
sourcePath := base64.RawURLEncoding.EncodeToString([]byte(path)) sourcePath := base64.RawURLEncoding.EncodeToString([]byte(path))
thumbURL := handler.getAPIUrl("thumb") + "/" + sourcePath thumbURL := handler.getAPIUrl("thumb") + "/" + sourcePath
ttl := model.GetIntSetting("slave_api_timeout", 60) ttl := model.GetIntSetting("preview_timeout", 60)
signedThumbURL, err := auth.SignURI(handler.AuthInstance, thumbURL, int64(ttl)) signedThumbURL, err := auth.SignURI(handler.AuthInstance, thumbURL, int64(ttl))
if err != nil { if err != nil {
return nil, err return nil, err

@ -347,7 +347,7 @@ func TestHandler_Thumb(t *testing.T) {
AuthInstance: auth.HMACAuth{}, AuthInstance: auth.HMACAuth{},
} }
ctx := context.Background() ctx := context.Background()
asserts.NoError(cache.Set("setting_slave_api_timeout", "60", 0)) asserts.NoError(cache.Set("preview_timeout", "60", 0))
resp, err := handler.Thumb(ctx, "/1.txt") resp, err := handler.Thumb(ctx, "/1.txt")
asserts.NoError(err) asserts.NoError(err)
asserts.True(resp.Redirect) asserts.True(resp.Redirect)

@ -34,6 +34,11 @@ func (fs *FileSystem) ValidateLegalName(ctx context.Context, name string) bool {
return false return false
} }
// 结尾不能是空格
if strings.HasSuffix(name, " ") {
return false
}
return true return true
} }

@ -38,6 +38,8 @@ func TestFileSystem_ValidateLegalName(t *testing.T) {
asserts.False(fs.ValidateLegalName(ctx, "/11.txt")) asserts.False(fs.ValidateLegalName(ctx, "/11.txt"))
asserts.False(fs.ValidateLegalName(ctx, "\\11.txt")) asserts.False(fs.ValidateLegalName(ctx, "\\11.txt"))
asserts.False(fs.ValidateLegalName(ctx, "")) asserts.False(fs.ValidateLegalName(ctx, ""))
asserts.False(fs.ValidateLegalName(ctx, "1.tx t "))
asserts.True(fs.ValidateLegalName(ctx, "1.tx t"))
} }
func TestFileSystem_ValidateCapacity(t *testing.T) { func TestFileSystem_ValidateCapacity(t *testing.T) {

Loading…
Cancel
Save