|
|
@ -90,7 +90,6 @@ func (this *MatterService) Upload(file io.Reader, user *User, dirMatter *Matter, |
|
|
this.userService.MatterLock(user.Uuid) |
|
|
this.userService.MatterLock(user.Uuid) |
|
|
defer this.userService.MatterUnlock(user.Uuid) |
|
|
defer this.userService.MatterUnlock(user.Uuid) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//验证dirMatter
|
|
|
//验证dirMatter
|
|
|
if dirMatter == nil { |
|
|
if dirMatter == nil { |
|
|
panic(result.BadRequest("dirMatter cannot be nil.")) |
|
|
panic(result.BadRequest("dirMatter cannot be nil.")) |
|
|
@ -245,14 +244,153 @@ func (this *MatterService) CreateDirectory(dirMatter *Matter, name string, user |
|
|
return matter |
|
|
return matter |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//处理 移动和复制时可能存在的覆盖问题。
|
|
|
|
|
|
func (this *MatterService) handleOverwrite(userUuid string, destinationPath string, overwrite bool) { |
|
|
|
|
|
|
|
|
|
|
|
//目标matter。因为有可能已经存在了
|
|
|
|
|
|
destMatter := this.matterDao.findByUserUuidAndPath(userUuid, destinationPath) |
|
|
|
|
|
//如果目标matter存在了。
|
|
|
|
|
|
if destMatter != nil { |
|
|
|
|
|
//如果目标matter还存在了。
|
|
|
|
|
|
if overwrite { |
|
|
|
|
|
//要求覆盖。那么删除。
|
|
|
|
|
|
this.matterDao.Delete(destMatter) |
|
|
|
|
|
} else { |
|
|
|
|
|
this.PanicBadRequest("%s已经存在,操作失败!", destMatter.Path) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//将一个srcMatter复制到另一个destMatter(必须为文件夹)下,名字叫做name
|
|
|
} |
|
|
func (this *MatterService) Copy(srcMatter *Matter, destDirMatter *Matter, name string) { |
|
|
|
|
|
|
|
|
//将一个srcMatter放置到另一个destMatter(必须为文件夹)下 不关注 overwrite 和 lock.
|
|
|
|
|
|
func (this *MatterService) innerMove(srcMatter *Matter, destDirMatter *Matter) { |
|
|
|
|
|
|
|
|
|
|
|
if srcMatter == nil { |
|
|
|
|
|
panic(result.BadRequest("srcMatter cannot be nil.")) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if !destDirMatter.Dir { |
|
|
if !destDirMatter.Dir { |
|
|
this.PanicBadRequest("目标必须为文件夹") |
|
|
this.PanicBadRequest("目标必须为文件夹") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if srcMatter.Dir { |
|
|
|
|
|
//如果源是文件夹
|
|
|
|
|
|
destAbsolutePath := destDirMatter.AbsolutePath() + "/" + srcMatter.Name |
|
|
|
|
|
srcAbsolutePath := srcMatter.AbsolutePath() |
|
|
|
|
|
|
|
|
|
|
|
//物理文件一口气移动
|
|
|
|
|
|
err := os.Rename(srcAbsolutePath, destAbsolutePath) |
|
|
|
|
|
this.PanicError(err) |
|
|
|
|
|
|
|
|
|
|
|
//修改数据库中信息
|
|
|
|
|
|
srcMatter.Puuid = destDirMatter.Uuid |
|
|
|
|
|
srcMatter.Path = destDirMatter.Path + "/" + srcMatter.Name |
|
|
|
|
|
srcMatter = this.matterDao.Save(srcMatter) |
|
|
|
|
|
|
|
|
|
|
|
//调整该文件夹下文件的Path.
|
|
|
|
|
|
matters := this.matterDao.List(srcMatter.Uuid, srcMatter.UserUuid, nil) |
|
|
|
|
|
for _, m := range matters { |
|
|
|
|
|
this.adjustPath(m, srcMatter) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
//如果源是普通文件
|
|
|
|
|
|
|
|
|
|
|
|
destAbsolutePath := destDirMatter.AbsolutePath() + "/" + srcMatter.Name |
|
|
|
|
|
srcAbsolutePath := srcMatter.AbsolutePath() |
|
|
|
|
|
|
|
|
|
|
|
//物理文件进行移动
|
|
|
|
|
|
err := os.Rename(srcAbsolutePath, destAbsolutePath) |
|
|
|
|
|
this.PanicError(err) |
|
|
|
|
|
|
|
|
|
|
|
//删除对应的缓存。
|
|
|
|
|
|
this.imageCacheDao.DeleteByMatterUuid(srcMatter.Uuid) |
|
|
|
|
|
|
|
|
|
|
|
//修改数据库中信息
|
|
|
|
|
|
srcMatter.Puuid = destDirMatter.Uuid |
|
|
|
|
|
srcMatter.Path = destDirMatter.Path + "/" + srcMatter.Name |
|
|
|
|
|
srcMatter = this.matterDao.Save(srcMatter) |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//将一个srcMatter放置到另一个destMatter(必须为文件夹)下
|
|
|
|
|
|
func (this *MatterService) Move(srcMatter *Matter, destDirMatter *Matter, overwrite bool) { |
|
|
|
|
|
|
|
|
|
|
|
if srcMatter == nil { |
|
|
|
|
|
panic(result.BadRequest("srcMatter cannot be nil.")) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//操作锁
|
|
|
|
|
|
this.userService.MatterLock(srcMatter.UserUuid) |
|
|
|
|
|
defer this.userService.MatterUnlock(srcMatter.UserUuid) |
|
|
|
|
|
|
|
|
|
|
|
if !destDirMatter.Dir { |
|
|
|
|
|
this.PanicBadRequest("目标必须为文件夹") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//文件夹不能把自己移入到自己中,也不可以移入到自己的子文件夹下。
|
|
|
|
|
|
destDirMatter = this.WrapDetail(destDirMatter) |
|
|
|
|
|
tmpMatter := destDirMatter |
|
|
|
|
|
for tmpMatter != nil { |
|
|
|
|
|
if srcMatter.Uuid == tmpMatter.Uuid { |
|
|
|
|
|
panic("文件夹不能把自己移入到自己中,也不可以移入到自己的子文件夹下。") |
|
|
|
|
|
} |
|
|
|
|
|
tmpMatter = tmpMatter.Parent |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//处理覆盖的问题
|
|
|
|
|
|
destinationPath := destDirMatter.Path + "/" + srcMatter.Name |
|
|
|
|
|
this.handleOverwrite(srcMatter.UserUuid, destinationPath, overwrite) |
|
|
|
|
|
|
|
|
|
|
|
//做move操作。
|
|
|
|
|
|
this.innerMove(srcMatter, destDirMatter) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//将一个srcMatter放置到另一个destMatter(必须为文件夹)下
|
|
|
|
|
|
func (this *MatterService) MoveBatch(srcMatters []*Matter, destDirMatter *Matter) { |
|
|
|
|
|
|
|
|
|
|
|
if destDirMatter == nil { |
|
|
|
|
|
panic(result.BadRequest("destDirMatter cannot be nil.")) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//操作锁
|
|
|
|
|
|
this.userService.MatterLock(destDirMatter.UserUuid) |
|
|
|
|
|
defer this.userService.MatterUnlock(destDirMatter.UserUuid) |
|
|
|
|
|
|
|
|
|
|
|
if srcMatters == nil { |
|
|
|
|
|
panic(result.BadRequest("srcMatters cannot be nil.")) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if !destDirMatter.Dir { |
|
|
|
|
|
this.PanicBadRequest("目标必须为文件夹") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//文件夹不能把自己移入到自己中,也不可以移入到自己的子文件夹下。
|
|
|
|
|
|
destDirMatter = this.WrapDetail(destDirMatter) |
|
|
|
|
|
for _, srcMatter := range srcMatters { |
|
|
|
|
|
|
|
|
|
|
|
tmpMatter := destDirMatter |
|
|
|
|
|
for tmpMatter != nil { |
|
|
|
|
|
if srcMatter.Uuid == tmpMatter.Uuid { |
|
|
|
|
|
panic("文件夹不能把自己移入到自己中,也不可以移入到自己的子文件夹下。") |
|
|
|
|
|
} |
|
|
|
|
|
tmpMatter = tmpMatter.Parent |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for _, srcMatter := range srcMatters { |
|
|
|
|
|
this.innerMove(srcMatter, destDirMatter) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//内部移动一个文件(提供给Copy调用),无需关心overwrite问题。
|
|
|
|
|
|
func (this *MatterService) innerCopy(srcMatter *Matter, destDirMatter *Matter, name string) { |
|
|
|
|
|
|
|
|
if srcMatter.Dir { |
|
|
if srcMatter.Dir { |
|
|
|
|
|
|
|
|
//如果源是文件夹
|
|
|
//如果源是文件夹
|
|
|
@ -275,10 +413,11 @@ func (this *MatterService) Copy(srcMatter *Matter, destDirMatter *Matter, name s |
|
|
//复制子文件或文件夹
|
|
|
//复制子文件或文件夹
|
|
|
matters := this.matterDao.List(srcMatter.Uuid, srcMatter.UserUuid, nil) |
|
|
matters := this.matterDao.List(srcMatter.Uuid, srcMatter.UserUuid, nil) |
|
|
for _, m := range matters { |
|
|
for _, m := range matters { |
|
|
this.Copy(m, newMatter, m.Name) |
|
|
this.innerCopy(m, newMatter, m.Name) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} else { |
|
|
} else { |
|
|
|
|
|
|
|
|
//如果源是普通文件
|
|
|
//如果源是普通文件
|
|
|
destAbsolutePath := destDirMatter.AbsolutePath() + "/" + name |
|
|
destAbsolutePath := destDirMatter.AbsolutePath() + "/" + name |
|
|
srcAbsolutePath := srcMatter.AbsolutePath() |
|
|
srcAbsolutePath := srcMatter.AbsolutePath() |
|
|
@ -298,13 +437,113 @@ func (this *MatterService) Copy(srcMatter *Matter, destDirMatter *Matter, name s |
|
|
Privacy: srcMatter.Privacy, |
|
|
Privacy: srcMatter.Privacy, |
|
|
Path: destDirMatter.Path + "/" + name, |
|
|
Path: destDirMatter.Path + "/" + name, |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
newMatter = this.matterDao.Create(newMatter) |
|
|
newMatter = this.matterDao.Create(newMatter) |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//将一个srcMatter复制到另一个destMatter(必须为文件夹)下,名字叫做name
|
|
|
|
|
|
func (this *MatterService) Copy(srcMatter *Matter, destDirMatter *Matter, name string, overwrite bool) { |
|
|
|
|
|
|
|
|
|
|
|
if srcMatter == nil { |
|
|
|
|
|
panic(result.BadRequest("srcMatter cannot be nil.")) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//操作锁
|
|
|
|
|
|
this.userService.MatterLock(srcMatter.UserUuid) |
|
|
|
|
|
defer this.userService.MatterUnlock(srcMatter.UserUuid) |
|
|
|
|
|
|
|
|
|
|
|
if !destDirMatter.Dir { |
|
|
|
|
|
this.PanicBadRequest("目标必须为文件夹") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
destinationPath := destDirMatter.Path + "/" + name |
|
|
|
|
|
this.handleOverwrite(srcMatter.UserUuid, destinationPath, overwrite) |
|
|
|
|
|
|
|
|
|
|
|
this.innerCopy(srcMatter, destDirMatter, name) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//将一个matter 重命名为 name
|
|
|
|
|
|
func (this *MatterService) Rename(matter *Matter, name string, user *User) { |
|
|
|
|
|
|
|
|
|
|
|
if user == nil { |
|
|
|
|
|
this.PanicBadRequest("user cannot be nil") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//操作锁
|
|
|
|
|
|
this.userService.MatterLock(user.Uuid) |
|
|
|
|
|
defer this.userService.MatterUnlock(user.Uuid) |
|
|
|
|
|
|
|
|
|
|
|
//验证参数。
|
|
|
|
|
|
if name == "" { |
|
|
|
|
|
this.PanicBadRequest("name参数必填") |
|
|
|
|
|
} |
|
|
|
|
|
if m, _ := regexp.MatchString(`[<>|*?/\\]`, name); m { |
|
|
|
|
|
this.PanicBadRequest(`名称中不能包含以下特殊符号:< > | * ? / \`) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if len(name) > 200 { |
|
|
|
|
|
panic("name长度不能超过200") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if name == matter.Name { |
|
|
|
|
|
this.PanicBadRequest("新名称和旧名称一样,操作失败!") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//判断同级文件夹中是否有同名的文件
|
|
|
|
|
|
count := this.matterDao.CountByUserUuidAndPuuidAndDirAndName(user.Uuid, matter.Puuid, matter.Dir, name) |
|
|
|
|
|
|
|
|
|
|
|
if count > 0 { |
|
|
|
|
|
this.PanicBadRequest("【" + name + "】已经存在了,请使用其他名称。") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if matter.Dir { |
|
|
|
|
|
//如果源是文件夹
|
|
|
|
|
|
|
|
|
|
|
|
oldAbsolutePath := matter.AbsolutePath() |
|
|
|
|
|
absoluteDirPath := GetDirOfPath(oldAbsolutePath) |
|
|
|
|
|
relativeDirPath := GetDirOfPath(matter.Path) |
|
|
|
|
|
newAbsolutePath := absoluteDirPath + "/" + name |
|
|
|
|
|
|
|
|
|
|
|
//物理文件一口气移动
|
|
|
|
|
|
err := os.Rename(oldAbsolutePath, newAbsolutePath) |
|
|
|
|
|
this.PanicError(err) |
|
|
|
|
|
|
|
|
|
|
|
//修改数据库中信息
|
|
|
|
|
|
matter.Name = name |
|
|
|
|
|
matter.Path = relativeDirPath + "/" + name |
|
|
|
|
|
matter = this.matterDao.Save(matter) |
|
|
|
|
|
|
|
|
|
|
|
//调整该文件夹下文件的Path.
|
|
|
|
|
|
matters := this.matterDao.List(matter.Uuid, matter.UserUuid, nil) |
|
|
|
|
|
for _, m := range matters { |
|
|
|
|
|
this.adjustPath(m, matter) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
//如果源是普通文件
|
|
|
|
|
|
|
|
|
|
|
|
oldAbsolutePath := matter.AbsolutePath() |
|
|
|
|
|
absoluteDirPath := GetDirOfPath(oldAbsolutePath) |
|
|
|
|
|
relativeDirPath := GetDirOfPath(matter.Path) |
|
|
|
|
|
newAbsolutePath := absoluteDirPath + "/" + name |
|
|
|
|
|
|
|
|
|
|
|
//物理文件进行移动
|
|
|
|
|
|
err := os.Rename(oldAbsolutePath, newAbsolutePath) |
|
|
|
|
|
this.PanicError(err) |
|
|
|
|
|
|
|
|
|
|
|
//删除对应的缓存。
|
|
|
|
|
|
this.imageCacheDao.DeleteByMatterUuid(matter.Uuid) |
|
|
|
|
|
|
|
|
|
|
|
//修改数据库中信息
|
|
|
|
|
|
matter.Name = name |
|
|
|
|
|
matter.Path = relativeDirPath + "/" + name |
|
|
|
|
|
matter = this.matterDao.Save(matter) |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//根据一个文件夹路径,找到最后一个文件夹的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) { |
|
|
@ -367,11 +606,12 @@ func (this *MatterService) GetDirUuid(user *User, dir string) (puuid string, dir |
|
|
return puuid, parentRelativePath |
|
|
return puuid, parentRelativePath |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//包装某个matter的详情。会把父级依次倒着装进去。如果中途出错,直接抛出异常。
|
|
|
|
|
|
func (this *MatterService) WrapDetail(matter *Matter) *Matter { |
|
|
|
|
|
|
|
|
//获取某个文件的详情,会把父级依次倒着装进去。如果中途出错,直接抛出异常。
|
|
|
if matter == nil { |
|
|
func (this *MatterService) Detail(uuid string) *Matter { |
|
|
this.PanicBadRequest("matter cannot be nil.") |
|
|
|
|
|
} |
|
|
matter := this.matterDao.CheckByUuid(uuid) |
|
|
|
|
|
|
|
|
|
|
|
//组装file的内容,展示其父组件。
|
|
|
//组装file的内容,展示其父组件。
|
|
|
puuid := matter.Puuid |
|
|
puuid := matter.Puuid |
|
|
@ -386,36 +626,10 @@ func (this *MatterService) Detail(uuid string) *Matter { |
|
|
return matter |
|
|
return matter |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 从指定的url下载一个文件。参考:https://golangcode.com/download-a-file-from-a-url/
|
|
|
//获取某个文件的详情,会把父级依次倒着装进去。如果中途出错,直接抛出异常。
|
|
|
func (this *MatterService) httpDownloadFile(filepath string, url string) (int64, error) { |
|
|
func (this *MatterService) Detail(uuid string) *Matter { |
|
|
|
|
|
matter := this.matterDao.CheckByUuid(uuid) |
|
|
// Create the file
|
|
|
return this.WrapDetail(matter) |
|
|
out, err := os.Create(filepath) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return 0, err |
|
|
|
|
|
} |
|
|
|
|
|
defer func() { |
|
|
|
|
|
e := out.Close() |
|
|
|
|
|
this.PanicError(e) |
|
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
|
|
// Get the data
|
|
|
|
|
|
resp, err := http.Get(url) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return 0, err |
|
|
|
|
|
} |
|
|
|
|
|
defer func() { |
|
|
|
|
|
e := resp.Body.Close() |
|
|
|
|
|
this.PanicError(e) |
|
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
|
|
// Write the body to file
|
|
|
|
|
|
size, err := io.Copy(out, resp.Body) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return 0, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return size, nil |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//去指定的url中爬文件
|
|
|
//去指定的url中爬文件
|
|
|
@ -432,7 +646,7 @@ func (this *MatterService) Crawl(url string, filename string, user *User, puuid |
|
|
|
|
|
|
|
|
//使用临时文件存放
|
|
|
//使用临时文件存放
|
|
|
fmt.Printf("存放于%s", absolutePath) |
|
|
fmt.Printf("存放于%s", absolutePath) |
|
|
size, err := this.httpDownloadFile(absolutePath, url) |
|
|
size, err := download.HttpDownloadFile(absolutePath, url) |
|
|
this.PanicError(err) |
|
|
this.PanicError(err) |
|
|
|
|
|
|
|
|
//判断用户自身上传大小的限制。
|
|
|
//判断用户自身上传大小的限制。
|
|
|
@ -495,128 +709,3 @@ func (this *MatterService) adjustPath(matter *Matter, parentMatter *Matter) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//将一个srcMatter放置到另一个destMatter(必须为文件夹)下
|
|
|
|
|
|
func (this *MatterService) Move(srcMatter *Matter, destMatter *Matter) { |
|
|
|
|
|
|
|
|
|
|
|
if !destMatter.Dir { |
|
|
|
|
|
this.PanicBadRequest("目标必须为文件夹") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if srcMatter.Dir { |
|
|
|
|
|
//如果源是文件夹
|
|
|
|
|
|
destAbsolutePath := destMatter.AbsolutePath() + "/" + srcMatter.Name |
|
|
|
|
|
srcAbsolutePath := srcMatter.AbsolutePath() |
|
|
|
|
|
|
|
|
|
|
|
//物理文件一口气移动
|
|
|
|
|
|
err := os.Rename(srcAbsolutePath, destAbsolutePath) |
|
|
|
|
|
this.PanicError(err) |
|
|
|
|
|
|
|
|
|
|
|
//修改数据库中信息
|
|
|
|
|
|
srcMatter.Puuid = destMatter.Uuid |
|
|
|
|
|
srcMatter.Path = destMatter.Path + "/" + srcMatter.Name |
|
|
|
|
|
srcMatter = this.matterDao.Save(srcMatter) |
|
|
|
|
|
|
|
|
|
|
|
//调整该文件夹下文件的Path.
|
|
|
|
|
|
matters := this.matterDao.List(srcMatter.Uuid, srcMatter.UserUuid, nil) |
|
|
|
|
|
for _, m := range matters { |
|
|
|
|
|
this.adjustPath(m, srcMatter) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
//如果源是普通文件
|
|
|
|
|
|
|
|
|
|
|
|
destAbsolutePath := destMatter.AbsolutePath() + "/" + srcMatter.Name |
|
|
|
|
|
srcAbsolutePath := srcMatter.AbsolutePath() |
|
|
|
|
|
|
|
|
|
|
|
//物理文件进行移动
|
|
|
|
|
|
err := os.Rename(srcAbsolutePath, destAbsolutePath) |
|
|
|
|
|
this.PanicError(err) |
|
|
|
|
|
|
|
|
|
|
|
//删除对应的缓存。
|
|
|
|
|
|
this.imageCacheDao.DeleteByMatterUuid(srcMatter.Uuid) |
|
|
|
|
|
|
|
|
|
|
|
//修改数据库中信息
|
|
|
|
|
|
srcMatter.Puuid = destMatter.Uuid |
|
|
|
|
|
srcMatter.Path = destMatter.Path + "/" + srcMatter.Name |
|
|
|
|
|
srcMatter = this.matterDao.Save(srcMatter) |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//将一个matter 重命名为 name
|
|
|
|
|
|
func (this *MatterService) Rename(matter *Matter, name string, user *User) { |
|
|
|
|
|
|
|
|
|
|
|
//验证参数。
|
|
|
|
|
|
if name == "" { |
|
|
|
|
|
this.PanicBadRequest("name参数必填") |
|
|
|
|
|
} |
|
|
|
|
|
if m, _ := regexp.MatchString(`[<>|*?/\\]`, name); m { |
|
|
|
|
|
this.PanicBadRequest(`名称中不能包含以下特殊符号:< > | * ? / \`) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if len(name) > 200 { |
|
|
|
|
|
panic("name长度不能超过200") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if name == matter.Name { |
|
|
|
|
|
this.PanicBadRequest("新名称和旧名称一样,操作失败!") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//判断同级文件夹中是否有同名的文件
|
|
|
|
|
|
count := this.matterDao.CountByUserUuidAndPuuidAndDirAndName(user.Uuid, matter.Puuid, matter.Dir, name) |
|
|
|
|
|
|
|
|
|
|
|
if count > 0 { |
|
|
|
|
|
this.PanicBadRequest("【" + name + "】已经存在了,请使用其他名称。") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if matter.Dir { |
|
|
|
|
|
//如果源是文件夹
|
|
|
|
|
|
|
|
|
|
|
|
oldAbsolutePath := matter.AbsolutePath() |
|
|
|
|
|
absoluteDirPath := GetDirOfPath(oldAbsolutePath) |
|
|
|
|
|
relativeDirPath := GetDirOfPath(matter.Path) |
|
|
|
|
|
newAbsolutePath := absoluteDirPath + "/" + name |
|
|
|
|
|
|
|
|
|
|
|
//物理文件一口气移动
|
|
|
|
|
|
err := os.Rename(oldAbsolutePath, newAbsolutePath) |
|
|
|
|
|
this.PanicError(err) |
|
|
|
|
|
|
|
|
|
|
|
//修改数据库中信息
|
|
|
|
|
|
matter.Name = name |
|
|
|
|
|
matter.Path = relativeDirPath + "/" + name |
|
|
|
|
|
matter = this.matterDao.Save(matter) |
|
|
|
|
|
|
|
|
|
|
|
//调整该文件夹下文件的Path.
|
|
|
|
|
|
matters := this.matterDao.List(matter.Uuid, matter.UserUuid, nil) |
|
|
|
|
|
for _, m := range matters { |
|
|
|
|
|
this.adjustPath(m, matter) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
//如果源是普通文件
|
|
|
|
|
|
|
|
|
|
|
|
oldAbsolutePath := matter.AbsolutePath() |
|
|
|
|
|
absoluteDirPath := GetDirOfPath(oldAbsolutePath) |
|
|
|
|
|
relativeDirPath := GetDirOfPath(matter.Path) |
|
|
|
|
|
newAbsolutePath := absoluteDirPath + "/" + name |
|
|
|
|
|
|
|
|
|
|
|
//物理文件进行移动
|
|
|
|
|
|
err := os.Rename(oldAbsolutePath, newAbsolutePath) |
|
|
|
|
|
this.PanicError(err) |
|
|
|
|
|
|
|
|
|
|
|
//删除对应的缓存。
|
|
|
|
|
|
this.imageCacheDao.DeleteByMatterUuid(matter.Uuid) |
|
|
|
|
|
|
|
|
|
|
|
//修改数据库中信息
|
|
|
|
|
|
matter.Name = name |
|
|
|
|
|
matter.Path = relativeDirPath + "/" + name |
|
|
|
|
|
matter = this.matterDao.Save(matter) |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|