Finish some code refine work.
This commit is contained in:
@ -279,7 +279,9 @@ func (this *AlienController) Upload(writer http.ResponseWriter, request *http.Re
|
|||||||
panic("文件大小不正确")
|
panic("文件大小不正确")
|
||||||
}
|
}
|
||||||
|
|
||||||
matter := this.matterService.Upload(file, user, uploadToken.FolderUuid, uploadToken.Filename, uploadToken.Privacy, true)
|
dirMatter := this.matterDao.CheckDirByUuid(uploadToken.FolderUuid, user)
|
||||||
|
|
||||||
|
matter := this.matterService.Upload(file, user, dirMatter, uploadToken.Filename, uploadToken.Privacy)
|
||||||
|
|
||||||
//更新这个uploadToken的信息.
|
//更新这个uploadToken的信息.
|
||||||
uploadToken.ExpireTime = time.Now()
|
uploadToken.ExpireTime = time.Now()
|
||||||
|
@ -252,7 +252,8 @@ func (this *DavService) HandlePut(writer http.ResponseWriter, request *http.Requ
|
|||||||
this.matterService.Delete(srcMatter)
|
this.matterService.Delete(srcMatter)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.matterService.Upload(request.Body, user, matter.Uuid, filename, true, false)
|
|
||||||
|
this.matterService.Upload(request.Body, user, matter, filename, true)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,7 +170,6 @@ func (this *MatterController) Page(writer http.ResponseWriter, request *http.Req
|
|||||||
return this.Success(pager)
|
return this.Success(pager)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//创建一个文件夹。
|
//创建一个文件夹。
|
||||||
func (this *MatterController) CreateDirectory(writer http.ResponseWriter, request *http.Request) *result.WebResult {
|
func (this *MatterController) CreateDirectory(writer http.ResponseWriter, request *http.Request) *result.WebResult {
|
||||||
|
|
||||||
@ -178,7 +177,6 @@ func (this *MatterController) CreateDirectory(writer http.ResponseWriter, reques
|
|||||||
name := request.FormValue("name")
|
name := request.FormValue("name")
|
||||||
userUuid := request.FormValue("userUuid")
|
userUuid := request.FormValue("userUuid")
|
||||||
|
|
||||||
|
|
||||||
//管理员可以指定给某个用户创建文件夹。
|
//管理员可以指定给某个用户创建文件夹。
|
||||||
user := this.checkUser(writer, request)
|
user := this.checkUser(writer, request)
|
||||||
if user.Role != USER_ROLE_ADMINISTRATOR {
|
if user.Role != USER_ROLE_ADMINISTRATOR {
|
||||||
@ -198,8 +196,6 @@ func (this *MatterController) CreateDirectory(writer http.ResponseWriter, reques
|
|||||||
return this.Success(matter)
|
return this.Success(matter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//上传文件
|
//上传文件
|
||||||
func (this *MatterController) Upload(writer http.ResponseWriter, request *http.Request) *result.WebResult {
|
func (this *MatterController) Upload(writer http.ResponseWriter, request *http.Request) *result.WebResult {
|
||||||
|
|
||||||
@ -236,7 +232,9 @@ func (this *MatterController) Upload(writer http.ResponseWriter, request *http.R
|
|||||||
fileName = fileName[pos+1:]
|
fileName = fileName[pos+1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
matter := this.matterService.Upload(file, user, puuid, fileName, privacy, false)
|
dirMatter := this.matterDao.CheckDirByUuid(puuid, user)
|
||||||
|
|
||||||
|
matter := this.matterService.Upload(file, user, dirMatter, fileName, privacy)
|
||||||
|
|
||||||
return this.Success(matter)
|
return this.Success(matter)
|
||||||
}
|
}
|
||||||
|
@ -31,21 +31,39 @@ func (this *MatterDao) FindByUuid(uuid string) *Matter {
|
|||||||
var matter Matter
|
var matter Matter
|
||||||
db := CONTEXT.DB.Where(&Matter{Base: Base{Uuid: uuid}}).First(&matter)
|
db := CONTEXT.DB.Where(&Matter{Base: Base{Uuid: uuid}}).First(&matter)
|
||||||
if db.Error != nil {
|
if db.Error != nil {
|
||||||
return nil
|
if db.Error.Error() == result.DB_ERROR_NOT_FOUND {
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
this.PanicError(db.Error)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return &matter
|
return &matter
|
||||||
}
|
}
|
||||||
|
|
||||||
//按照Id查询文件
|
//按照Id查询文件
|
||||||
func (this *MatterDao) CheckByUuid(uuid string) *Matter {
|
func (this *MatterDao) CheckByUuid(uuid string) *Matter {
|
||||||
|
matter := this.FindByUuid(uuid)
|
||||||
|
if matter == nil {
|
||||||
|
this.PanicNotFound("%s 对应的matter不存在", uuid)
|
||||||
|
}
|
||||||
|
return matter
|
||||||
|
}
|
||||||
|
|
||||||
// Read
|
|
||||||
var matter Matter
|
|
||||||
db := CONTEXT.DB.Where(&Matter{Base: Base{Uuid: uuid}}).First(&matter)
|
|
||||||
this.PanicError(db.Error)
|
|
||||||
|
|
||||||
return &matter
|
//按照uuid查找一个文件夹,可能返回root对应的matter.
|
||||||
|
func (this *MatterDao) CheckDirByUuid(uuid string, user *User) *Matter {
|
||||||
|
|
||||||
|
var matter *Matter
|
||||||
|
if uuid == MATTER_ROOT {
|
||||||
|
if user == nil {
|
||||||
|
this.PanicBadRequest("user cannot be nil.")
|
||||||
|
}
|
||||||
|
matter = NewRootMatter(user)
|
||||||
|
} else {
|
||||||
|
matter = this.CheckByUuid(uuid)
|
||||||
|
}
|
||||||
|
|
||||||
|
return matter
|
||||||
}
|
}
|
||||||
|
|
||||||
//按照名字查询文件夹
|
//按照名字查询文件夹
|
||||||
|
@ -15,7 +15,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 文件。alien表示是否是应用内使用的文件,比如说蓝眼云盘的头像,alien = true 这种文件在上传时不需要指定存放目录,会统一放在同一个文件夹下。
|
* 文件。
|
||||||
*/
|
*/
|
||||||
type Matter struct {
|
type Matter struct {
|
||||||
Base
|
Base
|
||||||
@ -23,7 +23,6 @@ type Matter struct {
|
|||||||
UserUuid string `json:"userUuid" gorm:"type:char(36);index:idx_uu"`
|
UserUuid string `json:"userUuid" gorm:"type:char(36);index:idx_uu"`
|
||||||
Username string `json:"username" gorm:"type:varchar(45) not null"`
|
Username string `json:"username" gorm:"type:varchar(45) not null"`
|
||||||
Dir bool `json:"dir" gorm:"type:tinyint(1) not null;default:0"`
|
Dir bool `json:"dir" gorm:"type:tinyint(1) not null;default:0"`
|
||||||
Alien bool `json:"alien" gorm:"type:tinyint(1) not null;default:0"`
|
|
||||||
Name string `json:"name" gorm:"type:varchar(255) not null"`
|
Name string `json:"name" gorm:"type:varchar(255) not null"`
|
||||||
Md5 string `json:"md5" gorm:"type:varchar(45)"`
|
Md5 string `json:"md5" gorm:"type:varchar(45)"`
|
||||||
Size int64 `json:"size" gorm:"type:bigint(20) not null;default:0"`
|
Size int64 `json:"size" gorm:"type:bigint(20) not null;default:0"`
|
||||||
|
@ -71,53 +71,43 @@ func (this *MatterService) Delete(matter *Matter) {
|
|||||||
panic(result.BadRequest("matter不能为nil"))
|
panic(result.BadRequest("matter不能为nil"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//操作锁
|
//操作锁
|
||||||
this.userService.MatterLock(matter.UserUuid)
|
this.userService.MatterLock(matter.UserUuid)
|
||||||
defer this.userService.MatterUnlock(matter.UserUuid)
|
defer this.userService.MatterUnlock(matter.UserUuid)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.matterDao.Delete(matter)
|
this.matterDao.Delete(matter)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//开始上传文件
|
//开始上传文件
|
||||||
//上传文件. alien表明文件是否是应用使用的文件。
|
//上传文件. alien表明文件是否是应用使用的文件。
|
||||||
func (this *MatterService) Upload(file io.Reader, user *User, puuid string, filename string, privacy bool, alien bool) *Matter {
|
func (this *MatterService) Upload(file io.Reader, user *User, dirMatter *Matter, filename string, privacy bool) *Matter {
|
||||||
|
|
||||||
|
if user == nil {
|
||||||
|
panic(result.BadRequest("user cannot be nil."))
|
||||||
|
}
|
||||||
|
|
||||||
|
//操作锁
|
||||||
|
this.userService.MatterLock(user.Uuid)
|
||||||
|
defer this.userService.MatterUnlock(user.Uuid)
|
||||||
|
|
||||||
|
|
||||||
|
//验证dirMatter
|
||||||
|
if dirMatter == nil {
|
||||||
|
panic(result.BadRequest("dirMatter cannot be nil."))
|
||||||
|
}
|
||||||
|
|
||||||
//文件名不能太长。
|
//文件名不能太长。
|
||||||
if len(filename) > 200 {
|
if len(filename) > MATTER_NAME_MAX_LENGTH {
|
||||||
panic("文件名不能超过200")
|
panic(result.BadRequest("文件名不能超过%s", MATTER_NAME_MAX_LENGTH))
|
||||||
}
|
}
|
||||||
|
|
||||||
//文件夹路径
|
//文件夹路径
|
||||||
var dirAbsolutePath string
|
dirAbsolutePath := dirMatter.AbsolutePath()
|
||||||
var dirRelativePath string
|
dirRelativePath := dirMatter.Path
|
||||||
if puuid == "" {
|
|
||||||
this.PanicBadRequest("puuid必填")
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if puuid == MATTER_ROOT {
|
count := this.matterDao.CountByUserUuidAndPuuidAndDirAndName(user.Uuid, dirMatter.Uuid, false, filename)
|
||||||
dirAbsolutePath = GetUserFileRootDir(user.Username)
|
if count > 0 {
|
||||||
dirRelativePath = ""
|
panic(result.BadRequest("该目录下%s已经存在了", filename))
|
||||||
} else {
|
|
||||||
//验证puuid是否存在
|
|
||||||
dirMatter := this.matterDao.CheckByUuidAndUserUuid(puuid, user.Uuid)
|
|
||||||
|
|
||||||
dirAbsolutePath = GetUserFileRootDir(user.Username) + dirMatter.Path
|
|
||||||
dirRelativePath = dirMatter.Path
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//查找文件夹下面是否有同名文件。
|
|
||||||
matters := this.matterDao.ListByUserUuidAndPuuidAndDirAndName(user.Uuid, puuid, false, filename)
|
|
||||||
//如果有同名的文件,那么我们直接覆盖同名文件。
|
|
||||||
for _, dbFile := range matters {
|
|
||||||
this.PanicBadRequest("该目录下%s已经存在了", dbFile.Name)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//获取文件应该存放在的物理路径的绝对路径和相对路径。
|
//获取文件应该存放在的物理路径的绝对路径和相对路径。
|
||||||
@ -136,39 +126,119 @@ func (this *MatterService) Upload(file io.Reader, user *User, puuid string, file
|
|||||||
this.PanicError(removeError)
|
this.PanicError(removeError)
|
||||||
}
|
}
|
||||||
|
|
||||||
distFile, err := os.OpenFile(fileAbsolutePath, os.O_WRONLY|os.O_CREATE, 0777)
|
destFile, err := os.OpenFile(fileAbsolutePath, os.O_WRONLY|os.O_CREATE, 0777)
|
||||||
this.PanicError(err)
|
this.PanicError(err)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
err := distFile.Close()
|
err := destFile.Close()
|
||||||
this.PanicError(err)
|
this.PanicError(err)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
written, err := io.Copy(distFile, file)
|
fileSize, err := io.Copy(destFile, file)
|
||||||
this.PanicError(err)
|
this.PanicError(err)
|
||||||
|
|
||||||
this.logger.Info("上传文件%s大小为%v", filename, HumanFileSize(written))
|
this.logger.Info("上传文件 %s 大小为 %v ", filename, HumanFileSize(fileSize))
|
||||||
|
|
||||||
//判断用户自身上传大小的限制。
|
//判断用户自身上传大小的限制。
|
||||||
if user.SizeLimit >= 0 {
|
if user.SizeLimit >= 0 {
|
||||||
if written > user.SizeLimit {
|
if fileSize > user.SizeLimit {
|
||||||
this.PanicBadRequest("文件大小超出限制 " + HumanFileSize(user.SizeLimit) + ">" + HumanFileSize(written))
|
//删除上传过来的内容
|
||||||
|
err = os.Remove(fileAbsolutePath)
|
||||||
|
this.PanicError(err)
|
||||||
|
|
||||||
|
panic(result.BadRequest("文件大小超出限制 %s > %s ", HumanFileSize(user.SizeLimit), HumanFileSize(fileSize)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//将文件信息存入数据库中。
|
//将文件信息存入数据库中。
|
||||||
matter := &Matter{
|
matter := &Matter{
|
||||||
Puuid: puuid,
|
Puuid: dirMatter.Uuid,
|
||||||
UserUuid: user.Uuid,
|
UserUuid: user.Uuid,
|
||||||
Username: user.Username,
|
Username: user.Username,
|
||||||
Dir: false,
|
Dir: false,
|
||||||
Alien: alien,
|
|
||||||
Name: filename,
|
Name: filename,
|
||||||
Md5: "",
|
Md5: "",
|
||||||
Size: written,
|
Size: fileSize,
|
||||||
Privacy: privacy,
|
Privacy: privacy,
|
||||||
Path: fileRelativePath,
|
Path: fileRelativePath,
|
||||||
}
|
}
|
||||||
|
matter = this.matterDao.Create(matter)
|
||||||
|
|
||||||
|
return matter
|
||||||
|
}
|
||||||
|
|
||||||
|
//在dirMatter中创建文件夹 返回刚刚创建的这个文件夹
|
||||||
|
func (this *MatterService) CreateDirectory(dirMatter *Matter, name string, user *User) *Matter {
|
||||||
|
|
||||||
|
//操作锁
|
||||||
|
this.userService.MatterLock(user.Uuid)
|
||||||
|
defer this.userService.MatterUnlock(user.Uuid)
|
||||||
|
|
||||||
|
//父级matter必须存在
|
||||||
|
if dirMatter == nil {
|
||||||
|
panic(result.BadRequest("dirMatter必须指定"))
|
||||||
|
}
|
||||||
|
|
||||||
|
//必须是文件夹
|
||||||
|
if !dirMatter.Dir {
|
||||||
|
panic(result.BadRequest("dirMatter必须是文件夹"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if dirMatter.UserUuid != user.Uuid {
|
||||||
|
|
||||||
|
panic(result.BadRequest("dirMatter的userUuid和user不一致"))
|
||||||
|
}
|
||||||
|
|
||||||
|
name = strings.TrimSpace(name)
|
||||||
|
//验证参数。
|
||||||
|
if name == "" {
|
||||||
|
panic(result.BadRequest("name参数必填,并且不能全是空格"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(name) > MATTER_NAME_MAX_LENGTH {
|
||||||
|
|
||||||
|
panic(result.BadRequest("name长度不能超过%d", MATTER_NAME_MAX_LENGTH))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if m, _ := regexp.MatchString(`[<>|*?/\\]`, name); m {
|
||||||
|
panic(result.BadRequest(`名称中不能包含以下特殊符号:< > | * ? / \`))
|
||||||
|
}
|
||||||
|
|
||||||
|
//判断同级文件夹中是否有同名的文件夹
|
||||||
|
count := this.matterDao.CountByUserUuidAndPuuidAndDirAndName(user.Uuid, dirMatter.Uuid, true, name)
|
||||||
|
|
||||||
|
if count > 0 {
|
||||||
|
|
||||||
|
panic(result.BadRequest("%s 已经存在了,请使用其他名称。", name))
|
||||||
|
}
|
||||||
|
|
||||||
|
parts := strings.Split(dirMatter.Path, "/")
|
||||||
|
this.logger.Info("%s的层数:%d", dirMatter.Name, len(parts))
|
||||||
|
|
||||||
|
if len(parts) >= 32 {
|
||||||
|
panic(result.BadRequest("文件夹最多%d层", MATTER_NAME_MAX_DEPTH))
|
||||||
|
}
|
||||||
|
|
||||||
|
//绝对路径
|
||||||
|
absolutePath := GetUserFileRootDir(user.Username) + dirMatter.Path + "/" + name
|
||||||
|
|
||||||
|
//相对路径
|
||||||
|
relativePath := dirMatter.Path + "/" + name
|
||||||
|
|
||||||
|
//磁盘中创建文件夹。
|
||||||
|
dirPath := MakeDirAll(absolutePath)
|
||||||
|
this.logger.Info("Create Directory: %s", dirPath)
|
||||||
|
|
||||||
|
//数据库中创建文件夹。
|
||||||
|
matter := &Matter{
|
||||||
|
Puuid: dirMatter.Uuid,
|
||||||
|
UserUuid: user.Uuid,
|
||||||
|
Username: user.Username,
|
||||||
|
Dir: true,
|
||||||
|
Name: name,
|
||||||
|
Path: relativePath,
|
||||||
|
}
|
||||||
|
|
||||||
matter = this.matterDao.Create(matter)
|
matter = this.matterDao.Create(matter)
|
||||||
|
|
||||||
@ -176,6 +246,65 @@ func (this *MatterService) Upload(file io.Reader, user *User, puuid string, file
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//将一个srcMatter复制到另一个destMatter(必须为文件夹)下,名字叫做name
|
||||||
|
func (this *MatterService) Copy(srcMatter *Matter, destDirMatter *Matter, name string) {
|
||||||
|
|
||||||
|
if !destDirMatter.Dir {
|
||||||
|
this.PanicBadRequest("目标必须为文件夹")
|
||||||
|
}
|
||||||
|
|
||||||
|
if srcMatter.Dir {
|
||||||
|
|
||||||
|
//如果源是文件夹
|
||||||
|
|
||||||
|
//在目标地址创建新文件夹。
|
||||||
|
newMatter := &Matter{
|
||||||
|
Puuid: destDirMatter.Uuid,
|
||||||
|
UserUuid: srcMatter.UserUuid,
|
||||||
|
Username: srcMatter.Username,
|
||||||
|
Dir: srcMatter.Dir,
|
||||||
|
Name: name,
|
||||||
|
Md5: "",
|
||||||
|
Size: srcMatter.Size,
|
||||||
|
Privacy: srcMatter.Privacy,
|
||||||
|
Path: destDirMatter.Path + "/" + name,
|
||||||
|
}
|
||||||
|
|
||||||
|
newMatter = this.matterDao.Create(newMatter)
|
||||||
|
|
||||||
|
//复制子文件或文件夹
|
||||||
|
matters := this.matterDao.List(srcMatter.Uuid, srcMatter.UserUuid, nil)
|
||||||
|
for _, m := range matters {
|
||||||
|
this.Copy(m, newMatter, m.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
//如果源是普通文件
|
||||||
|
destAbsolutePath := destDirMatter.AbsolutePath() + "/" + name
|
||||||
|
srcAbsolutePath := srcMatter.AbsolutePath()
|
||||||
|
|
||||||
|
//物理文件进行复制
|
||||||
|
CopyFile(srcAbsolutePath, destAbsolutePath)
|
||||||
|
|
||||||
|
//创建新文件的数据库信息。
|
||||||
|
newMatter := &Matter{
|
||||||
|
Puuid: destDirMatter.Uuid,
|
||||||
|
UserUuid: srcMatter.UserUuid,
|
||||||
|
Username: srcMatter.Username,
|
||||||
|
Dir: srcMatter.Dir,
|
||||||
|
Name: name,
|
||||||
|
Md5: "",
|
||||||
|
Size: srcMatter.Size,
|
||||||
|
Privacy: srcMatter.Privacy,
|
||||||
|
Path: destDirMatter.Path + "/" + name,
|
||||||
|
}
|
||||||
|
|
||||||
|
newMatter = this.matterDao.Create(newMatter)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//根据一个文件夹路径,找到最后一个文件夹的uuid,如果中途出错,返回err.
|
//根据一个文件夹路径,找到最后一个文件夹的uuid,如果中途出错,返回err.
|
||||||
func (this *MatterService) GetDirUuid(user *User, dir string) (puuid string, dirRelativePath string) {
|
func (this *MatterService) GetDirUuid(user *User, dir string) (puuid string, dirRelativePath string) {
|
||||||
@ -225,7 +354,6 @@ func (this *MatterService) GetDirUuid(user *User, dir string) (puuid string, dir
|
|||||||
UserUuid: user.Uuid,
|
UserUuid: user.Uuid,
|
||||||
Username: user.Username,
|
Username: user.Username,
|
||||||
Dir: true,
|
Dir: true,
|
||||||
Alien: true,
|
|
||||||
Name: name,
|
Name: name,
|
||||||
Path: parentRelativePath + "/" + name,
|
Path: parentRelativePath + "/" + name,
|
||||||
}
|
}
|
||||||
@ -239,83 +367,6 @@ func (this *MatterService) GetDirUuid(user *User, dir string) (puuid string, dir
|
|||||||
return puuid, parentRelativePath
|
return puuid, parentRelativePath
|
||||||
}
|
}
|
||||||
|
|
||||||
//在dirMatter中创建文件夹 返回刚刚创建的这个文件夹
|
|
||||||
func (this *MatterService) CreateDirectory(dirMatter *Matter, name string, user *User) *Matter {
|
|
||||||
|
|
||||||
this.userService.MatterLock(user.Uuid)
|
|
||||||
defer this.userService.MatterUnlock(user.Uuid)
|
|
||||||
|
|
||||||
//父级matter必须存在
|
|
||||||
if dirMatter == nil {
|
|
||||||
panic(result.BadRequest("dirMatter必须指定"))
|
|
||||||
}
|
|
||||||
|
|
||||||
//必须是文件夹
|
|
||||||
if !dirMatter.Dir {
|
|
||||||
panic(result.BadRequest("dirMatter必须是文件夹"))
|
|
||||||
}
|
|
||||||
|
|
||||||
if dirMatter.UserUuid != user.Uuid {
|
|
||||||
|
|
||||||
panic(result.BadRequest("dirMatter的userUuid和user不一致"))
|
|
||||||
}
|
|
||||||
|
|
||||||
name = strings.TrimSpace(name)
|
|
||||||
//验证参数。
|
|
||||||
if name == "" {
|
|
||||||
panic(result.BadRequest("name参数必填,并且不能全是空格"))
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(name) > MATTER_NAME_MAX_LENGTH {
|
|
||||||
|
|
||||||
panic(result.BadRequest("name长度不能超过%d", MATTER_NAME_MAX_LENGTH))
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if m, _ := regexp.MatchString(`[<>|*?/\\]`, name); m {
|
|
||||||
|
|
||||||
panic(result.BadRequest(`名称中不能包含以下特殊符号:< > | * ? / \`))
|
|
||||||
}
|
|
||||||
|
|
||||||
//判断同级文件夹中是否有同名的文件夹
|
|
||||||
count := this.matterDao.CountByUserUuidAndPuuidAndDirAndName(user.Uuid, dirMatter.Uuid, true, name)
|
|
||||||
|
|
||||||
if count > 0 {
|
|
||||||
|
|
||||||
panic(result.BadRequest("%s 已经存在了,请使用其他名称。", name))
|
|
||||||
}
|
|
||||||
|
|
||||||
parts := strings.Split(dirMatter.Path, "/")
|
|
||||||
this.logger.Info("%s的层数:%d", dirMatter.Name, len(parts))
|
|
||||||
|
|
||||||
if len(parts) >= 32 {
|
|
||||||
panic(result.BadRequest("文件夹最多%d层", MATTER_NAME_MAX_DEPTH))
|
|
||||||
}
|
|
||||||
|
|
||||||
//绝对路径
|
|
||||||
absolutePath := GetUserFileRootDir(user.Username) + dirMatter.Path + "/" + name
|
|
||||||
|
|
||||||
//相对路径
|
|
||||||
relativePath := dirMatter.Path + "/" + name
|
|
||||||
|
|
||||||
//磁盘中创建文件夹。
|
|
||||||
dirPath := MakeDirAll(absolutePath)
|
|
||||||
this.logger.Info("Create Directory: %s", dirPath)
|
|
||||||
|
|
||||||
//数据库中创建文件夹。
|
|
||||||
matter := &Matter{
|
|
||||||
Puuid: dirMatter.Uuid,
|
|
||||||
UserUuid: user.Uuid,
|
|
||||||
Username: user.Username,
|
|
||||||
Dir: true,
|
|
||||||
Name: name,
|
|
||||||
Path: relativePath,
|
|
||||||
}
|
|
||||||
|
|
||||||
matter = this.matterDao.Create(matter)
|
|
||||||
|
|
||||||
return matter
|
|
||||||
}
|
|
||||||
|
|
||||||
//获取某个文件的详情,会把父级依次倒着装进去。如果中途出错,直接抛出异常。
|
//获取某个文件的详情,会把父级依次倒着装进去。如果中途出错,直接抛出异常。
|
||||||
func (this *MatterService) Detail(uuid string) *Matter {
|
func (this *MatterService) Detail(uuid string) *Matter {
|
||||||
@ -404,7 +455,6 @@ func (this *MatterService) Crawl(url string, filename string, user *User, puuid
|
|||||||
UserUuid: user.Uuid,
|
UserUuid: user.Uuid,
|
||||||
Username: user.Username,
|
Username: user.Username,
|
||||||
Dir: false,
|
Dir: false,
|
||||||
Alien: false,
|
|
||||||
Name: filename,
|
Name: filename,
|
||||||
Md5: "",
|
Md5: "",
|
||||||
Size: size,
|
Size: size,
|
||||||
@ -496,66 +546,6 @@ func (this *MatterService) Move(srcMatter *Matter, destMatter *Matter) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//将一个srcMatter复制到另一个destMatter(必须为文件夹)下,名字叫做name
|
|
||||||
func (this *MatterService) Copy(srcMatter *Matter, destDirMatter *Matter, name string) {
|
|
||||||
|
|
||||||
if !destDirMatter.Dir {
|
|
||||||
this.PanicBadRequest("目标必须为文件夹")
|
|
||||||
}
|
|
||||||
|
|
||||||
if srcMatter.Dir {
|
|
||||||
|
|
||||||
//如果源是文件夹
|
|
||||||
|
|
||||||
//在目标地址创建新文件夹。
|
|
||||||
newMatter := &Matter{
|
|
||||||
Puuid: destDirMatter.Uuid,
|
|
||||||
UserUuid: srcMatter.UserUuid,
|
|
||||||
Username: srcMatter.Username,
|
|
||||||
Dir: srcMatter.Dir,
|
|
||||||
Alien: srcMatter.Alien,
|
|
||||||
Name: name,
|
|
||||||
Md5: "",
|
|
||||||
Size: srcMatter.Size,
|
|
||||||
Privacy: srcMatter.Privacy,
|
|
||||||
Path: destDirMatter.Path + "/" + name,
|
|
||||||
}
|
|
||||||
|
|
||||||
newMatter = this.matterDao.Create(newMatter)
|
|
||||||
|
|
||||||
//复制子文件或文件夹
|
|
||||||
matters := this.matterDao.List(srcMatter.Uuid, srcMatter.UserUuid, nil)
|
|
||||||
for _, m := range matters {
|
|
||||||
this.Copy(m, newMatter, m.Name)
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
//如果源是普通文件
|
|
||||||
destAbsolutePath := destDirMatter.AbsolutePath() + "/" + name
|
|
||||||
srcAbsolutePath := srcMatter.AbsolutePath()
|
|
||||||
|
|
||||||
//物理文件进行复制
|
|
||||||
CopyFile(srcAbsolutePath, destAbsolutePath)
|
|
||||||
|
|
||||||
//创建新文件的数据库信息。
|
|
||||||
newMatter := &Matter{
|
|
||||||
Puuid: destDirMatter.Uuid,
|
|
||||||
UserUuid: srcMatter.UserUuid,
|
|
||||||
Username: srcMatter.Username,
|
|
||||||
Dir: srcMatter.Dir,
|
|
||||||
Alien: srcMatter.Alien,
|
|
||||||
Name: name,
|
|
||||||
Md5: "",
|
|
||||||
Size: srcMatter.Size,
|
|
||||||
Privacy: srcMatter.Privacy,
|
|
||||||
Path: destDirMatter.Path + "/" + name,
|
|
||||||
}
|
|
||||||
|
|
||||||
newMatter = this.matterDao.Create(newMatter)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//将一个matter 重命名为 name
|
//将一个matter 重命名为 name
|
||||||
func (this *MatterService) Rename(matter *Matter, name string, user *User) {
|
func (this *MatterService) Rename(matter *Matter, name string, user *User) {
|
||||||
|
Reference in New Issue
Block a user