From 20ea86eaf6504ff14f45927da0cf146a97b928b2 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Tue, 19 Nov 2019 17:20:59 +0800 Subject: [PATCH] Fix: test failed due to `Policy.AutoName` --- models/file.go | 7 +++++++ models/file_test.go | 18 ++++++++++++++++++ models/policy_test.go | 4 +++- pkg/filesystem/filesystem.go | 11 +++++++++++ pkg/filesystem/hooks.go | 10 ++++++++++ 5 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 models/file_test.go diff --git a/models/file.go b/models/file.go index 0abc6af..0a30966 100644 --- a/models/file.go +++ b/models/file.go @@ -15,3 +15,10 @@ type File struct { PolicyID uint Dir string `gorm:"size:65536"` } + +// GetFileByPathAndName 给定路径、文件名、用户ID,查找文件 +func GetFileByPathAndName(path string, name string, uid uint) (File, error) { + var file File + result := DB.Where("user_id = ? AND dir = ? AND name=?", uid, path, name).Find(&file) + return file, result.Error +} diff --git a/models/file_test.go b/models/file_test.go new file mode 100644 index 0000000..68dd833 --- /dev/null +++ b/models/file_test.go @@ -0,0 +1,18 @@ +package model + +import ( + "github.com/DATA-DOG/go-sqlmock" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestGetFileByPathAndName(t *testing.T) { + asserts := assert.New(t) + + fileRows := sqlmock.NewRows([]string{"id", "name"}). + AddRow(1, "1.cia") + mock.ExpectQuery("SELECT(.+)").WillReturnRows(fileRows) + file, _ := GetFileByPathAndName("/", "1.cia", 1) + asserts.Equal("1.cia", file.Name) + asserts.NoError(mock.ExpectationsWereMet()) +} diff --git a/models/policy_test.go b/models/policy_test.go index d6571d8..87efbd6 100644 --- a/models/policy_test.go +++ b/models/policy_test.go @@ -76,7 +76,9 @@ func TestPolicy_GeneratePath(t *testing.T) { func TestPolicy_GenerateFileName(t *testing.T) { asserts := assert.New(t) - testPolicy := Policy{} + testPolicy := Policy{ + AutoRename: true, + } testPolicy.FileNameRule = "{randomkey16}" asserts.Len(testPolicy.GenerateFileName(1, "123.txt"), 16) diff --git a/pkg/filesystem/filesystem.go b/pkg/filesystem/filesystem.go index d7ad378..89c014d 100644 --- a/pkg/filesystem/filesystem.go +++ b/pkg/filesystem/filesystem.go @@ -7,6 +7,7 @@ import ( "github.com/HFO4/cloudreve/pkg/util" "github.com/gin-gonic/gin" "io" + "path" "path/filepath" ) @@ -165,3 +166,13 @@ func (fs *FileSystem) IsPathExist(path string) bool { _, err := model.GetFolderByPath(path, fs.User.ID) return err == nil } + +// IsFileExist 返回给定路径的文件是否存在 +func (fs *FileSystem) IsFileExist(fullPath string) bool { + basePath := path.Dir(fullPath) + fileName := path.Base(fullPath) + + _, err := model.GetFileByPathAndName(basePath, fileName, fs.User.ID) + + return err == nil +} diff --git a/pkg/filesystem/hooks.go b/pkg/filesystem/hooks.go index ad561da..f939b44 100644 --- a/pkg/filesystem/hooks.go +++ b/pkg/filesystem/hooks.go @@ -4,6 +4,7 @@ import ( "context" "errors" "github.com/HFO4/cloudreve/pkg/util" + "path" ) // GenericBeforeUpload 通用上传前处理钩子,包含数据库操作 @@ -61,5 +62,14 @@ func GenericAfterUpload(ctx context.Context, fs *FileSystem) error { if !fs.IsPathExist(virtualPath) { return errors.New("路径\"" + virtualPath + "\"不存在") } + + // 检查文件是否存在 + if fs.IsFileExist(path.Join( + virtualPath, + ctx.Value(FileCtx).(FileHeader).GetFileName(), + )) { + return errors.New("同名文件已存在") + } + return nil }