diff --git a/GinSkeleton/app/service/file/file_upload.go b/GinSkeleton/app/service/file/file_upload.go index a3e2a2f..f5ffb4a 100644 --- a/GinSkeleton/app/service/file/file_upload.go +++ b/GinSkeleton/app/service/file/file_upload.go @@ -2,6 +2,7 @@ package file import ( "encoding/base64" + "fmt" "os" "path/filepath" ) @@ -15,24 +16,41 @@ func FileSave(userName, savePath, fileDataBase64 string) error { baseDir := filepath.Join(currentDir, "file_library") fullFilePath := filepath.Join(baseDir, userName, savePath) - // 对 base64 编码的文件数据进行解码 base64.StdEncoding.DecodeString() + // 创建文件所在目录(如果不存在) + dir := filepath.Dir(fullFilePath) + if err := os.MkdirAll(dir, 0755); err != nil { + return err + } + + // 记录开始解码 + fmt.Println("开始对文件数据进行Base64解码...") fileData, err := base64.StdEncoding.DecodeString(fileDataBase64) if err != nil { + // 记录解码失败及错误信息 + fmt.Printf("Base64解码失败,错误信息:%v\n", err) return err } + // 记录解码成功 + fmt.Println("Base64解码成功") - // 创建目标文件,用于写入解码后的文件内容 + // 创建目标文件前记录日志 + fmt.Printf("准备创建文件:%s\n", fullFilePath) targetFile, err := os.Create(fullFilePath) if err != nil { + // 记录创建文件失败及错误信息 + fmt.Printf("创建文件失败,错误信息:%v\n", err) return err } defer targetFile.Close() - // 将解码后的文件内容写入到目标文件中 + // 写入文件内容前记录日志 + fmt.Println("准备写入文件内容") _, err = targetFile.Write(fileData) if err != nil { + // 记录写入文件内容失败及错误信息 + fmt.Printf("写入文件内容失败,错误信息:%v\n", err) return err } - + fmt.Println("文件内容写入成功") return nil } diff --git a/GinSkeleton/file_library/111/test2 b/GinSkeleton/file_library/111/test2 new file mode 100644 index 0000000..956431e --- /dev/null +++ b/GinSkeleton/file_library/111/test2 @@ -0,0 +1 @@ +基于大小模型协同的在线编辑器 \ No newline at end of file diff --git a/GinSkeleton/file_library/123/123/doc/yourFileNameHere b/GinSkeleton/file_library/123/123/doc/yourFileNameHere new file mode 100644 index 0000000..b8b01dc --- /dev/null +++ b/GinSkeleton/file_library/123/123/doc/yourFileNameHere @@ -0,0 +1 @@ +14124 \ No newline at end of file diff --git a/GinSkeleton/file_library/123/123/yourFileNameHere b/GinSkeleton/file_library/123/123/yourFileNameHere new file mode 100644 index 0000000..93a5f6a --- /dev/null +++ b/GinSkeleton/file_library/123/123/yourFileNameHere @@ -0,0 +1 @@ +123123 \ No newline at end of file diff --git a/coeditor_frontend/src/components/utils.js b/coeditor_frontend/src/components/utils.js index 9de13e4..f300a9c 100644 --- a/coeditor_frontend/src/components/utils.js +++ b/coeditor_frontend/src/components/utils.js @@ -1,6 +1,10 @@ // utils.js import { MarkdownToHtml } from '@ckeditor/ckeditor5-markdown-gfm/src/markdown2html/markdown2html.js'; import { HtmlToMarkdown } from '@ckeditor/ckeditor5-markdown-gfm/src/html2markdown/html2markdown.js'; +import axios from 'axios'; +// 导入ModulerUser模块 +import ModulerUser from '../store/user.js'; + // 获取用户配置 export function getUserConfigFromBackend() { // TODO 请求用户样式 @@ -95,8 +99,10 @@ export function getUserConfigFromBackend() { }; } +function isBase64(str) { + return /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$/.test(str); +} // TODO 实现自动保存saveData方法,将编辑内容发送至后端 -// DFZ export function saveData(data) { // return new Promise( resolve => { // setTimeout( () => { @@ -107,6 +113,65 @@ export function saveData(data) { // } ); console.log('saving...'); console.log(data); + + let encodedData; + if (typeof data ==='string') { + // 去除HTML标签,将内容转换为纯文本 + const textWithoutTags = data.replace(/<[^>]*>/g, ''); + // 使用btoa进行Base64编码,同时处理可能出现的编码异常情况(比如包含非ASCII字符等) + try { + encodedData = btoa(unescape(encodeURIComponent(textWithoutTags))); + } catch (e) { + console.error('对文本内容进行Base64编码时出错:', e); + throw new Error('数据编码失败,请检查数据内容'); + } + } else { + console.error('不支持的数据类型,请传入文本内容'); + throw new Error('不支持的数据类型'); + } + + if (!isBase64(encodedData)) { + console.error('Base64编码后的数据格式不正确'); + throw new Error('数据格式错误'); + } + + // 从ModulerUser模块的状态中获取相关信息 + const { username, path } = ModulerUser.state; + const fileName = 'yourFileNameHere'; // 这里需要替换为实际的文件名 + // path是相对用户主目录的路径各部分组成的数组,拼接成合适的相对路径字符串 + const savePath = path.join('/'); + + const formData = new FormData(); + formData.append('user_name', username); + formData.append('file_name', fileName); + formData.append('save_path', savePath); + formData.append('file_data', encodedData); + + return axios.post('http://localhost:14514/admin/file/file_save', formData, { + headers: { + 'Content-Type': 'multipart/form-data', + //'Authorization': `Bearer ${ModulerUser.state.access}` + } + }) + .then(response => { + if (response.status === 200 && response.data.code === 200 && response.data.data === "文件保存成功") { + console.log('文件保存成功,返回信息:', response.data); + return response.data; + } else { + console.error('文件保存失败,返回信息:', response.data); + throw new Error(`文件保存失败,返回信息: ${JSON.stringify(response.data)}`); + } + }) + .catch(error => { + if (error.response && error.response.status === 400) { + console.error('文件保存出现问题,可能是请求参数或后端业务逻辑执行出错,请检查相关信息'); + + } else { + console.error('保存文件出现其他错误:', error); + } + throw error; + }); + }