Browse Source

文件上传后删除等过程

master
ma-zhongxu 10 months ago
parent
commit
0b154dd313
  1. 3
      frontend/src/components/Modals/ManageWorkspace/Documents/Directory/index.jsx
  2. 3
      frontend/src/components/Modals/ManageWorkspace/Documents/UploadFile/index.jsx
  3. BIN
      server/downloaded_localFile
  4. 31
      server/endpoints/system.js
  5. 15
      server/endpoints/workspaces.js
  6. 38
      server/models/deptDocument.js
  7. 1
      server/storage/localFile/cebc49a6-9df4-46cc-8ba5-672b5d72de0e.txt
  8. 20
      server/storage/localFile/f51243b3-13e6-4374-8b64-a7fa4ba38ed9.txt
  9. 32
      server/utils/files/purgeDocument.js

3
frontend/src/components/Modals/ManageWorkspace/Documents/Directory/index.jsx

@ -66,7 +66,8 @@ function Directory({
for (const folder of files.items) { for (const folder of files.items) {
const foundItem = folder.items.find((file) => file.id === itemId); const foundItem = folder.items.find((file) => file.id === itemId);
if (foundItem) { if (foundItem) {
toRemove.push(`${folder.name}/${foundItem.name}`);
// toRemove.push(`${folder.name}/${foundItem.name}`);
toRemove.push(`${foundItem.relativePath}`);
break; break;
} }
} }

3
frontend/src/components/Modals/ManageWorkspace/Documents/UploadFile/index.jsx

@ -151,8 +151,7 @@ export default function UploadFile({
</button> </button>
</form> </form>
<div className="mt-6 text-center text-white text-opacity-80 text-xs font-medium w-[560px]"> <div className="mt-6 text-center text-white text-opacity-80 text-xs font-medium w-[560px]">
这些文件将被上传到运行于此的文档处理器上
AnythingLLM实例这些文件不会发送或与第三方共享
这些文件不会发送或与第三方共享请放心使用
</div> </div>
</div> </div>
); );

BIN
server/downloaded_localFile

31
server/endpoints/system.js

@ -391,17 +391,40 @@ function systemEndpoints(app) {
} }
); );
// app.delete(
// "/system/remove-documents",
// [validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])],
// async (request, response) => {
// try {
// const { names } = reqBody(request);
// console.log("names", names);
// for await (const name of names) await purgeDocument(name);
// response.sendStatus(200).end();
// } catch (e) {
// console.error(e.message, e);
// response.sendStatus(500).end();
// }
// }
// );
app.delete( app.delete(
"/system/remove-documents", "/system/remove-documents",
[validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])], [validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])],
async (request, response) => { async (request, response) => {
try { try {
const { names } = reqBody(request);
for await (const name of names) await purgeDocument(name);
response.sendStatus(200).end();
const { names } = reqBody(request); // 获取请求体中的文件名列表
console.log("names", names);
// 遍历文件名列表,调用 purgeDocument 方法
for (const name of names) {
await purgeDocument(name);
}
// 返回成功响应
response.status(200).json({ success: true, message: "Documents removed successfully." });
} catch (e) { } catch (e) {
console.error(e.message, e); console.error(e.message, e);
response.sendStatus(500).end();
response.status(500).json({ success: false, error: e.message });
} }
} }
); );

15
server/endpoints/workspaces.js

@ -39,6 +39,7 @@ const { DeptUsers } = require("../models/deptUsers");
const { DeptDocument } = require("../models/deptDocument"); const { DeptDocument } = require("../models/deptDocument");
const { v4: uuidv4 } = require("uuid"); const { v4: uuidv4 } = require("uuid");
const { moveAndRenameFile } = require("../utils/files/index"); const { moveAndRenameFile } = require("../utils/files/index");
const moment = require('moment'); // 引入时间格式化库
function workspaceEndpoints(app) { function workspaceEndpoints(app) {
if (!app) return; if (!app) return;
@ -288,11 +289,6 @@ function workspaceEndpoints(app) {
fs.mkdirSync(targetDir, { recursive: true }); // 递归创建目录 fs.mkdirSync(targetDir, { recursive: true }); // 递归创建目录
} }
// 保存文件
const filePath = path.join(targetDir, originalname); // 使用原始文件名
const fileBuffer = Buffer.from(fileContent, "base64");
fs.writeFileSync(filePath, fileBuffer);
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 假设路径字符串 // 假设路径字符串
const location = documents[0].location; const location = documents[0].location;
@ -303,7 +299,14 @@ function workspaceEndpoints(app) {
// 提取文件名 // 提取文件名
const parsedFileName = unixStylePath.substring(lastIndex + 1); const parsedFileName = unixStylePath.substring(lastIndex + 1);
const fileExtension = path.extname(request.file.path).toLowerCase(); const fileExtension = path.extname(request.file.path).toLowerCase();
const newFileName = uuidv4() + fileExtension; // 新文件名
// const newFileName = uuidv4() + fileExtension; // 新文件名
const newFileName = `${uuidv4()}_${moment().format('YYYYMMDD_HHmmss')}${fileExtension}`; // 生成唯一文件名
// 保存文件
const filePath = path.join(targetDir, newFileName); // 使用原始文件名
const fileBuffer = Buffer.from(fileContent, "base64");
fs.writeFileSync(filePath, fileBuffer);
const deptDocData = { const deptDocData = {
deptId: deptUserRecord.deptUser.deptId, deptId: deptUserRecord.deptUser.deptId,
parsedFileName: parsedFileName, parsedFileName: parsedFileName,

38
server/models/deptDocument.js

@ -220,6 +220,44 @@ const DeptDocument = {
throw error; throw error;
} }
}, },
/**
* 根据 parsedFilePath 模糊查询数据并将 delTag 更新为 true
* @param {string} parsedFilePath - 模糊查询的路径
* @returns {Promise<{ success: boolean, error: string | null, count: number }>}
*/
softDeleteByParsedFilePath: async function (parsedFilePath) {
try {
if (!parsedFilePath) {
throw new Error("parsedFilePath is required");
}
// 模糊查询 parsedFilePath
const result = await prisma.dept_document.updateMany({
where: {
parsedFilePath: {
contains: parsedFilePath, // 模糊匹配
},
},
data: {
delTag: true, // 将 delTag 更新为 true
lastUpdatedAt: new Date(), // 更新最后修改时间
},
});
return {
success: true,
error: null,
count: result.count, // 返回更新的记录数
};
} catch (error) {
console.error("FAILED TO SOFT DELETE BY PARSED FILE PATH.", error.message);
return {
success: false,
error: error.message,
count: 0,
};
}
},
}; };
module.exports = { DeptDocument }; module.exports = { DeptDocument };

1
server/storage/localFile/cebc49a6-9df4-46cc-8ba5-672b5d72de0e.txt

@ -1 +0,0 @@
你好

20
server/storage/localFile/f51243b3-13e6-4374-8b64-a7fa4ba38ed9.txt

@ -1,20 +0,0 @@
一、数字驼乡
1、政策类型修改增删改查接口的逻辑
2、服务事项主题分类增删改查逻辑修改,信息发布修改数据库字段类型
3、政策内容id改成UUID, 行业资讯id修改为UUID,政策解读ID修改为UUID,用户注册校验用户名是否重复, 商家信息新增和更新时校验商家名称和统一社会信用代码
4、商家信息添加字段:其他证照,商家信息添加字段:审核状态,审核时间,审核人,审核反馈; 商家资质添加字段:审核人
5、添加商家信息图标
7、政企服务建表,页面和路由生成,后端新开一个微服务
8、配合赵洋做商家信息相关的问题
9、 添加5个图标供参考
10、生成提问和反馈的页面和路由
11、商家信息修改时校验审核状态
12、提问反馈的页面字段错误问题和提问反馈的关联用户ID问题
13、修复商家信息和行业类型,行政区划实体里面的对应混乱问题
二、盟林草-森林保险管理系统
1、修改上次测出问题,部署
三、社会治理联动指挥平台(一期)
1、修复导航权限问题,部署

32
server/utils/files/purgeDocument.js

@ -9,10 +9,42 @@ const {
} = require("."); } = require(".");
const { Document } = require("../../models/documents"); const { Document } = require("../../models/documents");
const { Workspace } = require("../../models/workspace"); const { Workspace } = require("../../models/workspace");
const { DeptDocument } = require("../../models/deptDocument");
// async function purgeDocument(filename = null) {
// if (!filename || !normalizePath(filename)) return;
//
// await purgeVectorCache(filename);
// await purgeSourceDocument(filename);
// const workspaces = await Workspace.where();
// for (const workspace of workspaces) {
// await Document.removeDocuments(workspace, [filename]);
// }
// return;
// }
async function purgeDocument(filename = null) { async function purgeDocument(filename = null) {
if (!filename || !normalizePath(filename)) return; if (!filename || !normalizePath(filename)) return;
// 根据环境转换分隔符
let normalizedFilename = filename;
if (process.env.NODE_ENV === "development") {
// 开发环境:将路径分隔符转换为 Windows 风格(\)
normalizedFilename = filename.replace(/\//g, "\\");
} else {
// 生产环境:将路径分隔符转换为 Unix 风格(/)
normalizedFilename = filename.replace(/\\/g, "/");
}
// 标记匹配的文件为逻辑删除
const { success, error, count } = await DeptDocument.softDeleteByParsedFilePath(normalizedFilename);
if (!success) {
console.error("Failed to soft delete documents:", error);
return;
}
console.log(`Successfully marked ${count} documents as deleted.`);
// 继续执行原有的清理逻辑
await purgeVectorCache(filename); await purgeVectorCache(filename);
await purgeSourceDocument(filename); await purgeSourceDocument(filename);
const workspaces = await Workspace.where(); const workspaces = await Workspace.where();

Loading…
Cancel
Save