mirror of https://github.com/cloudreve/Cloudreve
fix: create directory now ignore conflict error, it will return the existed folder
parent
86877aef4b
commit
71df067a76
|
@ -23,11 +23,15 @@ type Folder struct {
|
||||||
|
|
||||||
// Create 创建目录
|
// Create 创建目录
|
||||||
func (folder *Folder) Create() (uint, error) {
|
func (folder *Folder) Create() (uint, error) {
|
||||||
if err := DB.Create(folder).Error; err != nil {
|
tx := DB.Begin()
|
||||||
|
if err := tx.FirstOrCreate(folder, *folder).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
util.Log().Warning("无法插入目录记录, %s", err)
|
util.Log().Warning("无法插入目录记录, %s", err)
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
return folder.ID, nil
|
|
||||||
|
err := tx.Commit().Error
|
||||||
|
return folder.ID, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetChild 返回folder下名为name的子目录,不存在则返回错误
|
// GetChild 返回folder下名为name的子目录,不存在则返回错误
|
||||||
|
|
|
@ -203,14 +203,10 @@ func SlaveAfterUpload(session *serializer.UploadSession) Hook {
|
||||||
func GenericAfterUpload(ctx context.Context, fs *FileSystem, fileHeader fsctx.FileHeader) error {
|
func GenericAfterUpload(ctx context.Context, fs *FileSystem, fileHeader fsctx.FileHeader) error {
|
||||||
fileInfo := fileHeader.Info()
|
fileInfo := fileHeader.Info()
|
||||||
|
|
||||||
// 检查路径是否存在,不存在就创建
|
// 创建或查找根目录
|
||||||
isExist, folder := fs.IsPathExist(fileInfo.VirtualPath)
|
folder, err := fs.CreateDirectory(ctx, fileInfo.VirtualPath)
|
||||||
if !isExist {
|
if err != nil {
|
||||||
newFolder, err := fs.CreateDirectory(ctx, fileInfo.VirtualPath)
|
return err
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
folder = newFolder
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查文件是否存在
|
// 检查文件是否存在
|
||||||
|
|
|
@ -376,7 +376,8 @@ func (fs *FileSystem) listObjects(ctx context.Context, parent string, files []mo
|
||||||
return objects
|
return objects
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateDirectory 根据给定的完整创建目录,支持递归创建
|
// CreateDirectory 根据给定的完整创建目录,支持递归创建。如果目录已存在,则直接
|
||||||
|
// 返回已存在的目录。
|
||||||
func (fs *FileSystem) CreateDirectory(ctx context.Context, fullPath string) (*model.Folder, error) {
|
func (fs *FileSystem) CreateDirectory(ctx context.Context, fullPath string) (*model.Folder, error) {
|
||||||
if fullPath == "/" || fullPath == "." || fullPath == "" {
|
if fullPath == "/" || fullPath == "." || fullPath == "" {
|
||||||
return nil, ErrRootProtected
|
return nil, ErrRootProtected
|
||||||
|
@ -398,10 +399,6 @@ func (fs *FileSystem) CreateDirectory(ctx context.Context, fullPath string) (*mo
|
||||||
// 父目录是否存在
|
// 父目录是否存在
|
||||||
isExist, parent := fs.IsPathExist(base)
|
isExist, parent := fs.IsPathExist(base)
|
||||||
if !isExist {
|
if !isExist {
|
||||||
// 递归创建父目录
|
|
||||||
if _, ok := ctx.Value(fsctx.IgnoreDirectoryConflictCtx).(bool); !ok {
|
|
||||||
ctx = context.WithValue(ctx, fsctx.IgnoreDirectoryConflictCtx, true)
|
|
||||||
}
|
|
||||||
newParent, err := fs.CreateDirectory(ctx, base)
|
newParent, err := fs.CreateDirectory(ctx, base)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -424,7 +421,7 @@ func (fs *FileSystem) CreateDirectory(ctx context.Context, fullPath string) (*mo
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if _, ok := ctx.Value(fsctx.IgnoreDirectoryConflictCtx).(bool); !ok {
|
if _, ok := ctx.Value(fsctx.IgnoreDirectoryConflictCtx).(bool); !ok {
|
||||||
return nil, ErrFolderExisted
|
return nil, fmt.Errorf("failed to create folder: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,18 +150,14 @@ func (job *ImportTask) Do() {
|
||||||
if parent, ok := pathCache[virtualPath]; ok {
|
if parent, ok := pathCache[virtualPath]; ok {
|
||||||
parentFolder = parent
|
parentFolder = parent
|
||||||
} else {
|
} else {
|
||||||
exist, folder := fs.IsPathExist(virtualPath)
|
folder, err := fs.CreateDirectory(context.Background(), virtualPath)
|
||||||
if exist {
|
if err != nil {
|
||||||
parentFolder = folder
|
util.Log().Warning("导入任务无法创建用户目录[%s], %s",
|
||||||
} else {
|
virtualPath, err)
|
||||||
folder, err := fs.CreateDirectory(context.Background(), virtualPath)
|
continue
|
||||||
if err != nil {
|
|
||||||
util.Log().Warning("导入任务无法创建用户目录[%s], %s",
|
|
||||||
virtualPath, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
parentFolder = folder
|
|
||||||
}
|
}
|
||||||
|
parentFolder = folder
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 插入文件记录
|
// 插入文件记录
|
||||||
|
|
|
@ -400,11 +400,7 @@ func (h *Handler) handleMkcol(w http.ResponseWriter, r *http.Request, fs *filesy
|
||||||
if r.ContentLength > 0 {
|
if r.ContentLength > 0 {
|
||||||
return http.StatusUnsupportedMediaType, nil
|
return http.StatusUnsupportedMediaType, nil
|
||||||
}
|
}
|
||||||
if strings.Contains(r.UserAgent(), "rclone") {
|
|
||||||
if _, ok := ctx.Value(fsctx.IgnoreDirectoryConflictCtx).(bool); !ok {
|
|
||||||
ctx = context.WithValue(ctx, fsctx.IgnoreDirectoryConflictCtx, true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if _, err := fs.CreateDirectory(ctx, reqPath); err != nil {
|
if _, err := fs.CreateDirectory(ctx, reqPath); err != nil {
|
||||||
return http.StatusConflict, err
|
return http.StatusConflict, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue