添加文件操作相关接口

master
dfz 8 months ago
parent 1ce989b3df
commit ec37768f0b

@ -239,4 +239,140 @@ type|form-data|string|必填|"summary"/"decoration"/"correction"/"extension"/"tr
},
"msg": "Success"
}
```
```
#### 创建文件
> <font color=#FF4500>*post*/admin/file/file_creat</font>
参数字段|参数属性|类型|选项
---|---|---|---|---
user_name|form-data|string|必填
file_name|form-data|string|必填
file_path|form-data|string|必填
> 返回示例:
```json
{
{
"code": 200,
"data": "文件创建成功",
"msg": "Success"
}
}
```
#### 创建文件夹
> <font color=#FF4500>*post*/admin/file/folder_creat</font>
参数字段|参数属性|类型|选项
---|---|---|---|---
user_name|form-data|string|必填
folder_name|form-data|string|必填
folder_path|form-data|string|必填
> 返回示例:
```json
{
{
"code": 200,
"data": "文件夹创建成功",
"msg": "Success"
}
}
```
#### 打开文件
> <font color=#FF4500>*post*/admin/file/file_get</font>
参数字段|参数属性|类型|选项
---|---|---|---|---
user_name|form-data|string|必填
file_name|form-data|string|必填
file_path|form-data|string|必填
> 返回示例:
```json
{
{
"code": 200,
"data": "文件获取成功",
"msg": "Success"
}
}
```
#### 文件重命名
> <font color=#FF4500>*post*/admin/file/file_rename</font>
参数字段|参数属性|类型|选项
---|---|---|---|---
user_name|form-data|string|必填
file_name|form-data|string|必填
file_path|form-data|string|必填
newname|form-data|string|必填
> 返回示例:
```json
{
{
"code": 200,
"data": "文件重命名成功",
"msg": "Success"
}
}
```
#### 移动文件
> <font color=#FF4500>*post*/admin/file/file_move</font>
参数字段|参数属性|类型|选项
---|---|---|---|---
user_name|form-data|string|必填
file_name|form-data|string|必填
file_path|form-data|string|必填
newpath|form-data|string|必填
> 返回示例:
```json
{
{
"code": 200,
"data": "文件移动成功",
"msg": "Success"
}
}
```
#### 保存文件
> <font color=#FF4500>*post*/admin/file/file_save</font>
参数字段|参数属性|类型|选项
---|---|---|---|---
user_name|form-data|string|必填
file_name|form-data|string|必填
save_path|form-data|string|必填
file_data|form-data|string|必填
> 返回示例:
```json
{
{
"code": 200,
"data": "文件保存成功",
"msg": "Success"
}
}
```
#### 删除文件
> <font color=#FF4500>*post*/admin/file/file_delete </font>
参数字段|参数属性|类型|选项
---|---|---|---|---
user_name|form-data|string|必填
file_name|form-data|string|必填
file_path|form-data|string|必填
> 返回示例:
```json
{
{
"code": 200,
"data": "文件删除成功",
"msg": "Success"
}
}
```

@ -54,6 +54,14 @@ const (
CurdLogoutFailMsg string = "登出失败"
CurdPublicKeyFailCode int = -400209
CurdPublicKeyFailMsg string = "密钥获取失败"
CurdFilePathErrorCode int = -400210
CurdFilePathErrorMsg string = "文件路径错误"
CurdFileNotExistCode int = -400211
CurdFileNotExistMsg string = "文件不存在"
CurdFileUploadErrorCode int = -400212
CurdFileUploadErrorMsg string = "文件上传失败"
CurdFileTypeErrorCode int = -400213
CurdFileTypeErrorMsg string = "文件类型错误"
//文件上传
FilesUploadFailCode int = -400250
FilesUploadFailMsg string = "文件上传失败, 获取上传文件发生错误!"

@ -0,0 +1,209 @@
package web
import (
"fmt"
"goskeleton/app/global/consts"
"goskeleton/app/service/file"
"goskeleton/app/utils/response"
"os"
"github.com/gin-gonic/gin"
)
type File struct {
}
// 创建文件
func (f *File) Creat(context *gin.Context) {
//从context获得路径和文件名并拼接获得最终文件路径
user_name := context.GetString(consts.ValidatorPrefix + "user_name")
file_Path := context.GetString(consts.ValidatorPrefix + "file_path")
file_Name := context.GetString(consts.ValidatorPrefix + "file_name")
final_Path := fmt.Sprintf("%s/%s.docx", file_Path, file_Name)
//file, err := os.Create(final_Path)
if err := file.CreateFile(user_name, final_Path); err != nil {
response.Fail(context, consts.CurdCreatFailCode, consts.CurdCreatFailMsg, err.Error())
return
}
// 文件创建成功,返回成功响应给客户端
response.Success(context, consts.CurdStatusOkMsg, "文件创建成功")
}
// 创建文件夹
func (f *File) FolderCreat(context *gin.Context) {
//从context获得路径和文件夹名并拼接获得最终文件夹路径
user_name := context.GetString(consts.ValidatorPrefix + "user_name")
folder_Path := context.GetString(consts.ValidatorPrefix + "folder_path")
folder_Name := context.GetString(consts.ValidatorPrefix + "folder_name")
final_Path := fmt.Sprintf("%s/%s", folder_Path, folder_Name)
if err := file.CreateFolder(user_name, final_Path); err != nil {
response.Fail(context, consts.CurdCreatFailCode, consts.CurdCreatFailMsg, err.Error())
return
}
// 文件创建成功,返回成功响应给客户端
response.Success(context, consts.CurdStatusOkMsg, "文件夹创建成功")
}
// 打开文件
func (f *File) Get(context *gin.Context) {
//从context获得路径和文件名并拼接获得最终文件路径
user_name := context.GetString(consts.ValidatorPrefix + "user_name")
file_Path := context.GetString(consts.ValidatorPrefix + "file_path")
file_Name := context.GetString(consts.ValidatorPrefix + "file_name")
final_Path := fmt.Sprintf("%s/%s.docx", file_Path, file_Name)
fileObj, err := file.GetFile(user_name, final_Path)
if err != nil {
// 根据不同的错误类型,返回更具体、合适的错误响应给客户端
switch err := err.(type) {
case *os.PathError:
//文件路径错误
response.Fail(context, consts.CurdFilePathErrorCode, consts.CurdFilePathErrorMsg, err.Error())
default:
if err == os.ErrNotExist {
//文件不存在错误
response.Fail(context, consts.CurdFileNotExistCode, consts.CurdFileNotExistMsg, err.Error())
}
}
return
}
defer fileObj.Close() // 确保文件使用完后被关闭
// 文件获取成功,返回成功响应给客户端
response.Success(context, consts.CurdStatusOkMsg, "文件获取成功")
}
// 文件重命名
func (f *File) Rename(context *gin.Context) {
//从context获得路径和文件名并拼接获得最终文件路径
user_name := context.GetString(consts.ValidatorPrefix + "user_name")
file_Path := context.GetString(consts.ValidatorPrefix + "file_path")
file_Name := context.GetString(consts.ValidatorPrefix + "file_name")
final_Path := fmt.Sprintf("%s/%s.docx", file_Path, file_Name)
//old_Name := context.GetString(consts.ValidatorPrefix + "oldname")
new_Name := context.GetString(consts.ValidatorPrefix + "newname")
new_finalpath := fmt.Sprintf("%s/%s.docx", file_Path, new_Name)
err := file.FileRename(user_name, final_Path, new_finalpath)
if err != nil {
// 根据不同的错误类型,返回更具体、合适的错误响应给客户端
switch err := err.(type) {
case *os.PathError:
//文件路径错误
response.Fail(context, consts.CurdFilePathErrorCode, consts.CurdFilePathErrorMsg, err.Error())
default:
if err == os.ErrNotExist {
//文件不存在错误
response.Fail(context, consts.CurdFileNotExistCode, consts.CurdFileNotExistMsg, err.Error())
}
}
return
}
// 文件重命名成功,返回成功响应给客户端
response.Success(context, consts.CurdStatusOkMsg, "文件重命名成功")
}
// 文件移动
func (f *File) Move(context *gin.Context) {
//从context获得路径和文件名并拼接获得最终文件路径
user_name := context.GetString(consts.ValidatorPrefix + "user_name")
file_Path := context.GetString(consts.ValidatorPrefix + "file_path")
file_Name := context.GetString(consts.ValidatorPrefix + "file_name")
final_Path := fmt.Sprintf("%s/%s.docx", file_Path, file_Name)
//old_Name := context.GetString(consts.ValidatorPrefix + "oldname")
new_Path := context.GetString(consts.ValidatorPrefix + "newpath")
new_finalpath := fmt.Sprintf("%s/%s.docx", new_Path, file_Name)
err := file.FileMove(user_name, final_Path, new_finalpath)
if err != nil {
// 根据不同的错误类型,返回更具体、合适的错误响应给客户端
switch err := err.(type) {
case *os.PathError:
//文件路径错误
response.Fail(context, consts.CurdFilePathErrorCode, consts.CurdFilePathErrorMsg, err.Error())
default:
if err == os.ErrNotExist {
//文件不存在错误
response.Fail(context, consts.CurdFileNotExistCode, consts.CurdFileNotExistMsg, err.Error())
}
}
return
}
// 文件移动成功,返回成功响应给客户端
response.Success(context, consts.CurdStatusOkMsg, "文件移动成功")
}
// 文件保存
func (f *File) Save(context *gin.Context) {
//从context获得路径和文件名并拼接获得最终文件路径
user_name := context.GetString(consts.ValidatorPrefix + "user_name")
Save_path := context.GetString(consts.ValidatorPrefix + "save_path")
file_Name := context.GetString(consts.ValidatorPrefix + "file_name")
final_savePath := fmt.Sprintf("%s/%s.docx", Save_path, file_Name)
fileDataBase64 := context.PostForm("file_data")
if fileDataBase64 == "" {
response.Fail(context, consts.CurdFileNotExistCode, consts.CurdFileNotExistMsg, nil)
return
}
err := file.FileSave(user_name, final_savePath, fileDataBase64)
if err != nil {
// 根据不同的错误类型,返回更具体、合适的错误响应给客户端
switch err := err.(type) {
case *os.PathError:
//文件路径错误
response.Fail(context, consts.CurdFilePathErrorCode, consts.CurdFilePathErrorMsg, err.Error())
default:
if err == os.ErrNotExist {
//文件不存在错误
response.Fail(context, consts.CurdFileNotExistCode, consts.CurdFileNotExistMsg, err.Error())
}
}
return
}
// 文件保存成功,返回成功响应给客户端
response.Success(context, consts.CurdStatusOkMsg, "文件保存成功")
}
// 文件删除
func (f *File) Delete(context *gin.Context) {
// 从context获得用户名、文件路径和文件名并拼接获得最终文件路径
user_name := context.GetString(consts.ValidatorPrefix + "user_name")
file_Path := context.GetString(consts.ValidatorPrefix + "file_path")
file_Name := context.GetString(consts.ValidatorPrefix + "file_name")
final_Path := fmt.Sprintf("%s/%s.docx", file_Path, file_Name)
err := file.FileDe(user_name, final_Path)
if err != nil {
// 根据不同的错误类型,返回更具体、合适的错误响应给客户端
switch err := err.(type) {
case *os.PathError:
//文件路径错误
response.Fail(context, consts.CurdFilePathErrorCode, consts.CurdFilePathErrorMsg, err.Error())
default:
if err == os.ErrNotExist {
//文件不存在错误
response.Fail(context, consts.CurdFileNotExistCode, consts.CurdFileNotExistMsg, err.Error())
}
}
return
}
// 文件删除成功,返回成功响应给客户端
response.Success(context, consts.CurdStatusOkMsg, "文件删除成功")
}

@ -6,9 +6,10 @@ import (
"goskeleton/app/http/validator/common/upload_files"
"goskeleton/app/http/validator/common/websocket"
"goskeleton/app/http/validator/web/ai_doc.go"
"goskeleton/app/http/validator/web/ai_layout"
"goskeleton/app/http/validator/web/ai_recognition"
"goskeleton/app/http/validator/web/file"
"goskeleton/app/http/validator/web/users"
"goskeleton/app/http/validator/web/ai_layout"
)
// 各个业务模块验证器必须进行注册(初始化),程序启动时会自动加载到容器
@ -63,5 +64,28 @@ func WebRegisterValidator() {
containers.Set(key, ai_layout.StyleGenerate{})
key = consts.ValidatorPrefix + "LayoutGenerate"
containers.Set(key, ai_layout.LayoutGenerate{})
//文件相关操作
//创建文件
key = consts.ValidatorPrefix + "FileCreat"
containers.Set(key, file.FileCreat{})
//创建文件夹
key = consts.ValidatorPrefix + "FolderCreat"
containers.Set(key, file.FolderCreat{})
//打开文件
key = consts.ValidatorPrefix + "FileGet"
containers.Set(key, file.FileGet{})
//文件重命名
key = consts.ValidatorPrefix + "FileRename"
containers.Set(key, file.FileRename{})
//移动文件
key = consts.ValidatorPrefix + "FileMove"
containers.Set(key, file.FileMove{})
//保存文件
key = consts.ValidatorPrefix + "FileSave"
containers.Set(key, file.FileSave{})
//删除文件
key = consts.ValidatorPrefix + "FileDelete"
containers.Set(key, file.FileDelete{})
}

@ -0,0 +1,37 @@
package file
import (
"goskeleton/app/global/consts"
"goskeleton/app/http/controller/web"
"goskeleton/app/http/validator/core/data_transfer"
"goskeleton/app/utils/response"
"github.com/gin-gonic/gin"
)
type FileDelete struct {
// 表单参数验证结构体支持匿名结构体嵌套
BaseField
FileInfo
}
// 验证器语法,参见 Register.go文件有详细说明
func (f FileDelete) CheckParams(context *gin.Context) {
//1.基本的验证规则没有通过
if err := context.ShouldBind(&f); err != nil {
response.ValidatorError(context, err)
return
}
// 该函数主要是将本结构体的字段(成员)按照 consts.ValidatorPrefix+ json标签对应的 键 => 值 形式绑定在上下文,便于下一步(控制器)可以直接通过 context.Get(键) 获取相关值
extraAddBindDataContext := data_transfer.DataAddContext(f, consts.ValidatorPrefix, context)
if extraAddBindDataContext == nil {
response.ErrorSystem(context, "FileDelete表单验证器json化失败", "")
} else {
// 验证完成,调用控制器,并将验证器成员(字段)递给控制器,保持上下文数据一致性
(&web.File{}).Delete(extraAddBindDataContext)
}
}

@ -0,0 +1,37 @@
package file
import (
"goskeleton/app/global/consts"
"goskeleton/app/http/controller/web"
"goskeleton/app/http/validator/core/data_transfer"
"goskeleton/app/utils/response"
"github.com/gin-gonic/gin"
)
type FileGet struct {
// 表单参数验证结构体支持匿名结构体嵌套
BaseField
FileInfo
}
// 验证器语法,参见 Register.go文件有详细说明
func (f FileGet) CheckParams(context *gin.Context) {
//1.基本的验证规则没有通过
if err := context.ShouldBind(&f); err != nil {
response.ValidatorError(context, err)
return
}
// 该函数主要是将本结构体的字段(成员)按照 consts.ValidatorPrefix+ json标签对应的 键 => 值 形式绑定在上下文,便于下一步(控制器)可以直接通过 context.Get(键) 获取相关值
extraAddBindDataContext := data_transfer.DataAddContext(f, consts.ValidatorPrefix, context)
if extraAddBindDataContext == nil {
response.ErrorSystem(context, "FileGet表单验证器json化失败", "")
} else {
// 验证完成,调用控制器,并将验证器成员(字段)递给控制器,保持上下文数据一致性
(&web.File{}).Get(extraAddBindDataContext)
}
}

@ -0,0 +1,38 @@
package file
import (
"goskeleton/app/global/consts"
"goskeleton/app/http/controller/web"
"goskeleton/app/http/validator/core/data_transfer"
"goskeleton/app/utils/response"
"github.com/gin-gonic/gin"
)
type FileRename struct {
// 表单参数验证结构体支持匿名结构体嵌套
BaseField
FileInfo
Filename
}
// 验证器语法,参见 Register.go文件有详细说明
func (f FileRename) CheckParams(context *gin.Context) {
//1.基本的验证规则没有通过
if err := context.ShouldBind(&f); err != nil {
response.ValidatorError(context, err)
return
}
// 该函数主要是将本结构体的字段(成员)按照 consts.ValidatorPrefix+ json标签对应的 键 => 值 形式绑定在上下文,便于下一步(控制器)可以直接通过 context.Get(键) 获取相关值
extraAddBindDataContext := data_transfer.DataAddContext(f, consts.ValidatorPrefix, context)
if extraAddBindDataContext == nil {
response.ErrorSystem(context, "FileRename表单验证器json化失败", "")
} else {
// 验证完成,调用控制器,并将验证器成员(字段)递给控制器,保持上下文数据一致性
(&web.File{}).Rename(extraAddBindDataContext)
}
}

@ -0,0 +1,50 @@
package file
import (
"goskeleton/app/global/consts"
"goskeleton/app/http/controller/web"
"goskeleton/app/http/validator/core/data_transfer"
"goskeleton/app/utils/response"
"github.com/gin-gonic/gin"
)
type FileSave struct {
// 表单参数验证结构体支持匿名结构体嵌套
BaseField
FileUpload
}
// 验证器语法,参见 Register.go文件有详细说明
func (f FileSave) CheckParams(context *gin.Context) {
//1.基本的验证规则没有通过
if err := context.ShouldBind(&f); err != nil {
response.ValidatorError(context, err)
return
}
// 尝试获取上传的文件,检查文件是否存在
//file, header, err := context.Request.FormFile("file")
//if err != nil {
// response.Fail(context, consts.CurdFileUploadErrorCode, consts.CurdFileUploadErrorMsg, "文件不存在或获取文件出错")
// return
//}
//defer file.Close()
// 对文件名后缀进行额外校验,确保是.docx文件假设只保存该类型文件
//if filepath.Ext(header.Filename) != ".docx" {
// response.Fail(context, consts.CurdFileTypeErrorCode, consts.CurdFileTypeErrorMsg, "只支持上传.docx文件")
// return
//}
// 该函数主要是将本结构体的字段(成员)按照 consts.ValidatorPrefix+ json标签对应的 键 => 值 形式绑定在上下文,便于下一步(控制器)可以直接通过 context.Get(键) 获取相关值
extraAddBindDataContext := data_transfer.DataAddContext(f, consts.ValidatorPrefix, context)
if extraAddBindDataContext == nil {
response.ErrorSystem(context, "FileSave表单验证器json化失败", "")
} else {
// 验证完成,调用控制器,并将验证器成员(字段)递给控制器,保持上下文数据一致性
(&web.File{}).Save(extraAddBindDataContext)
}
}

@ -0,0 +1,37 @@
package file
import (
"goskeleton/app/global/consts"
"goskeleton/app/http/controller/web"
"goskeleton/app/http/validator/core/data_transfer"
"goskeleton/app/utils/response"
"github.com/gin-gonic/gin"
)
type FileCreat struct {
// 表单参数验证结构体支持匿名结构体嵌套
BaseField
FileInfo
}
// 验证器语法,参见 Register.go文件有详细说明
func (f FileCreat) CheckParams(context *gin.Context) {
//1.基本的验证规则没有通过
if err := context.ShouldBind(&f); err != nil {
response.ValidatorError(context, err)
return
}
// 该函数主要是将本结构体的字段(成员)按照 consts.ValidatorPrefix+ json标签对应的 键 => 值 形式绑定在上下文,便于下一步(控制器)可以直接通过 context.Get(键) 获取相关值
extraAddBindDataContext := data_transfer.DataAddContext(f, consts.ValidatorPrefix, context)
if extraAddBindDataContext == nil {
response.ErrorSystem(context, "fileCreat表单验证器json化失败", "")
} else {
// 验证完成,调用控制器,并将验证器成员(字段)递给控制器,保持上下文数据一致性
(&web.File{}).Creat(extraAddBindDataContext)
}
}

@ -0,0 +1,38 @@
package file
import (
"goskeleton/app/global/consts"
"goskeleton/app/http/controller/web"
"goskeleton/app/http/validator/core/data_transfer"
"goskeleton/app/utils/response"
"github.com/gin-gonic/gin"
)
type FileMove struct {
// 表单参数验证结构体支持匿名结构体嵌套
BaseField
FileInfo
Filepath
}
// 验证器语法,参见 Register.go文件有详细说明
func (f FileMove) CheckParams(context *gin.Context) {
//1.基本的验证规则没有通过
if err := context.ShouldBind(&f); err != nil {
response.ValidatorError(context, err)
return
}
// 该函数主要是将本结构体的字段(成员)按照 consts.ValidatorPrefix+ json标签对应的 键 => 值 形式绑定在上下文,便于下一步(控制器)可以直接通过 context.Get(键) 获取相关值
extraAddBindDataContext := data_transfer.DataAddContext(f, consts.ValidatorPrefix, context)
if extraAddBindDataContext == nil {
response.ErrorSystem(context, "FileMove表单验证器json化失败", "")
} else {
// 验证完成,调用控制器,并将验证器成员(字段)递给控制器,保持上下文数据一致性
(&web.File{}).Move(extraAddBindDataContext)
}
}

@ -0,0 +1,37 @@
package file
import (
"goskeleton/app/global/consts"
"goskeleton/app/http/controller/web"
"goskeleton/app/http/validator/core/data_transfer"
"goskeleton/app/utils/response"
"github.com/gin-gonic/gin"
)
type FolderCreat struct {
// 表单参数验证结构体支持匿名结构体嵌套
BaseField
Folder
}
// 验证器语法,参见 Register.go文件有详细说明
func (f FolderCreat) CheckParams(context *gin.Context) {
//1.基本的验证规则没有通过
if err := context.ShouldBind(&f); err != nil {
response.ValidatorError(context, err)
return
}
// 该函数主要是将本结构体的字段(成员)按照 consts.ValidatorPrefix+ json标签对应的 键 => 值 形式绑定在上下文,便于下一步(控制器)可以直接通过 context.Get(键) 获取相关值
extraAddBindDataContext := data_transfer.DataAddContext(f, consts.ValidatorPrefix, context)
if extraAddBindDataContext == nil {
response.ErrorSystem(context, "folderCreat表单验证器json化失败", "")
} else {
// 验证完成,调用控制器,并将验证器成员(字段)递给控制器,保持上下文数据一致性
(&web.File{}).FolderCreat(extraAddBindDataContext)
}
}

@ -0,0 +1,31 @@
package file
type BaseField struct {
UserName string `form:"user_name" json:"user_name" binding:"required,min=3"` // 必填、对于文本,表示它的长度>=1
}
type FileInfo struct {
FileName string `form:"file_name" json:"file_name" binding:"required"` // 文件名必填
Path string `form:"file_path" json:"file_path" binding:"required"` // 文件路径必填
}
type Folder struct {
FoldereName string `form:"folder_name" json:"folder_name" binding:"required"` // 文件夹名必填
FolderPath string `form:"folder_path" json:"folder_path" binding:"required"` // 文件夹路径必填
}
type Filename struct {
//O_FileName string `form:"oldname" json:"oldname" binding:"required"` // 旧文件名
N_FileName string `form:"newname" json:"newname" binding:"required"` // 新文件名
}
type Filepath struct {
//O_FilePath string `form:"oldpath" json:"oldpath" binding:"required"` // 旧文件路径
N_FilePath string `form:"newpath" json:"newpath" binding:"required"` // 新文件路径
}
type FileUpload struct {
FileName string `form:"file_name" json:"file_name" binding:"required"` // 文件名必填
SavePath string `form:"save_path" json:"save_path" binding:"required"` // 保存路径必填
}

@ -0,0 +1,35 @@
package file
import (
"os"
"path/filepath"
)
func CreateFile(userName, filePath string) error {
// 获取main.go所在的目录
currentDir, err := os.Getwd()
if err != nil {
return err
}
baseDir := filepath.Join(currentDir, "file_library")
userDir := filepath.Join(baseDir, userName)
// 检查userName对应的文件夹是否存在如果不存在则创建
err = os.MkdirAll(userDir, 0755)
if err != nil {
return err
}
fullFilePath := filepath.Join(baseDir, userName, filePath)
file, err := os.Create(fullFilePath)
if err != nil {
return err
}
defer file.Close()
return nil
}

@ -0,0 +1,32 @@
package file
import (
"os"
"path/filepath"
)
func FileDe(userName, filePath string) error {
currentDir, err := os.Getwd()
if err != nil {
return err
}
baseDir := filepath.Join(currentDir, "file_library")
fullFilePath := filepath.Join(baseDir, userName, filePath)
// 判断文件是否存在
_, err = os.Stat(fullFilePath)
if err != nil {
if os.IsNotExist(err) {
return os.ErrNotExist
}
return err
}
err = os.Remove(fullFilePath)
if err != nil {
return err
}
return nil
}

@ -0,0 +1,26 @@
package file
import (
"os"
"path/filepath"
)
func GetFile(userName, filePath string) (*os.File, error) {
// 获取main.go所在的目录
currentDir, err := os.Getwd()
if err != nil {
return nil, err
}
baseDir := filepath.Join(currentDir, "file_library")
fullFilePath := filepath.Join(baseDir, userName, filePath)
file, err := os.Open(fullFilePath)
if err != nil {
return nil, err
}
return file, nil
}

@ -0,0 +1,40 @@
package file
import (
"os"
"path/filepath"
)
func FileMove(userName, O_FilePath, N_FilePath string) error {
// 获取main.go所在的目录
currentDir, err := os.Getwd()
if err != nil {
return err
}
baseDir := filepath.Join(currentDir, "file_library")
oldFullFilePath := filepath.Join(baseDir, userName, O_FilePath)
newFullFilePath := filepath.Join(baseDir, userName, N_FilePath)
// 先判断源文件是否存在
_, err = os.Stat(oldFullFilePath)
if err != nil {
return err
}
// 判断目标文件路径的上级目录是否存在,如果不存在则创建(确保目标路径合法)
targetDir := filepath.Dir(newFullFilePath)
err = os.MkdirAll(targetDir, 0755)
if err != nil {
return err
}
// 使用os.Rename进行文件移动操作
err = os.Rename(oldFullFilePath, newFullFilePath)
if err != nil {
return err
}
return nil
}

@ -0,0 +1,28 @@
package file
import (
"os"
"path/filepath"
)
func FileRename(userName, filePath, newFilePath string) error {
// 获取main.go所在的目录
currentDir, err := os.Getwd()
if err != nil {
return err
}
baseDir := filepath.Join(currentDir, "file_library")
oldfullFilePath := filepath.Join(baseDir, userName, filePath)
newfullFilePath := filepath.Join(baseDir, userName, newFilePath)
err = os.Rename(oldfullFilePath, newfullFilePath)
if err != nil {
return err
}
return nil
}

@ -0,0 +1,39 @@
package file
import (
"encoding/base64"
"os"
"path/filepath"
)
func FileSave(userName, savePath, fileDataBase64 string) error {
// 获取main.go所在的目录
currentDir, err := os.Getwd()
if err != nil {
return err
}
baseDir := filepath.Join(currentDir, "file_library")
fullFilePath := filepath.Join(baseDir, userName, savePath)
// 对 base64 编码的文件数据进行解码 base64.StdEncoding.DecodeString()
fileData, err := base64.StdEncoding.DecodeString(fileDataBase64)
if err != nil {
return err
}
// 创建目标文件,用于写入解码后的文件内容
targetFile, err := os.Create(fullFilePath)
if err != nil {
return err
}
defer targetFile.Close()
// 将解码后的文件内容写入到目标文件中
_, err = targetFile.Write(fileData)
if err != nil {
return err
}
return nil
}

@ -0,0 +1,26 @@
package file
import (
"os"
"path/filepath"
)
func CreateFolder(userName, folderPath string) error {
// 获取main.go所在的目录
currentDir, err := os.Getwd()
if err != nil {
return err
}
baseDir := filepath.Join(currentDir, "file_library")
fullFolderPath := filepath.Join(baseDir, userName, folderPath)
err = os.MkdirAll(fullFolderPath, 0755)
if err != nil {
return err
}
return nil
}

@ -0,0 +1 @@
基于大小模型协同的在线编辑器

@ -107,6 +107,29 @@ func InitWebRouter_Co() *gin.Engine {
users.POST("logout", validatorFactory.Create(consts.ValidatorPrefix+"UsersLogout"))
}
}
//【需要token】中间件验证的路由
backend.Use(authorization.CheckTokenAuth())
{
// 文件操作相关路由组
file := backend.Group("file/")
{
//创建文件
file.POST("file_creat", validatorFactory.Create(consts.ValidatorPrefix+"FileCreat"))
//打开文件
file.GET("file_get", validatorFactory.Create(consts.ValidatorPrefix+"FileGet"))
//文件重命名
file.POST("file_rename", validatorFactory.Create(consts.ValidatorPrefix+"FileRename"))
//移动文件
file.POST("file_move", validatorFactory.Create(consts.ValidatorPrefix+"FileMove"))
//保存文件
file.POST("file_save", validatorFactory.Create(consts.ValidatorPrefix+"FileSave"))
//删除文件
file.POST("file_delete", validatorFactory.Create(consts.ValidatorPrefix+"FileDelete"))
//创建文件夹
file.POST("folder_creat", validatorFactory.Create(consts.ValidatorPrefix+"FolderCreat"))
}
}
}
return router
}

Loading…
Cancel
Save