This commit is contained in:
2025-12-14 22:53:57 +05:00
parent d25ac311f3
commit d8e8298c27
4 changed files with 805 additions and 40 deletions

View File

@@ -752,17 +752,19 @@ app.post('/api/tasks', requireAuth, upload.array('files', 15), (req, res) => {
if (req.files && req.files.length > 0) {
const userFolder = createUserTaskFolder(taskId, req.session.user.login);
req.files.forEach(file => {
const newPath = path.join(userFolder, path.basename(file.filename));
fs.renameSync(file.path, newPath);
req.files.forEach(file => {
const newPath = path.join(userFolder, path.basename(file.filename));
fs.renameSync(file.path, newPath);
db.run(
"INSERT INTO task_files (task_id, user_id, filename, original_name, file_path, file_size) VALUES (?, ?, ?, ?, ?, ?)",
[taskId, createdBy, path.basename(file.filename), file.originalname, newPath, file.size]
);
const originalName = file.originalname;
logActivity(taskId, createdBy, 'FILE_UPLOADED', `Загружен файл: ${file.originalname}`);
});
db.run(
"INSERT INTO task_files (task_id, user_id, filename, original_name, file_path, file_size) VALUES (?, ?, ?, ?, ?, ?)",
[taskId, createdBy, path.basename(file.filename), originalName, newPath, file.size]
);
logActivity(taskId, createdBy, 'FILE_UPLOADED', `Загружен файл: ${originalName}`);
});
const tempDir = path.join(__dirname, 'data', 'uploads', 'temp');
if (fs.existsSync(tempDir)) {
@@ -919,17 +921,19 @@ app.put('/api/tasks/:taskId', requireAuth, upload.array('files', 15), (req, res)
if (req.files && req.files.length > 0) {
const userFolder = createUserTaskFolder(taskId, req.session.user.login);
req.files.forEach(file => {
const newPath = path.join(userFolder, path.basename(file.filename));
fs.renameSync(file.path, newPath);
req.files.forEach(file => {
const newPath = path.join(userFolder, path.basename(file.filename));
fs.renameSync(file.path, newPath);
db.run(
"INSERT INTO task_files (task_id, user_id, filename, original_name, file_path, file_size) VALUES (?, ?, ?, ?, ?, ?)",
[taskId, userId, path.basename(file.filename), file.originalname, newPath, file.size]
);
const originalName = file.originalname;
logActivity(taskId, userId, 'FILE_UPLOADED', `Загружен файл: ${file.originalname}`);
});
db.run(
"INSERT INTO task_files (task_id, user_id, filename, original_name, file_path, file_size) VALUES (?, ?, ?, ?, ?, ?)",
[taskId, createdBy, path.basename(file.filename), originalName, newPath, file.size]
);
logActivity(taskId, createdBy, 'FILE_UPLOADED', `Загружен файл: ${originalName}`);
});
const tempDir = path.join(__dirname, 'data', 'uploads', 'temp');
if (fs.existsSync(tempDir)) {
@@ -1276,14 +1280,19 @@ app.post('/api/tasks/:taskId/files', requireAuth, upload.array('files', 15), (re
return res.status(404).json({ error: 'Задача не найдена или у вас нет прав доступа' });
}
req.files.forEach(file => {
db.run(
"INSERT INTO task_files (task_id, user_id, filename, original_name, file_path, file_size) VALUES (?, ?, ?, ?, ?, ?)",
[taskId, userId, path.basename(file.filename), file.originalname, file.path, file.size]
);
req.files.forEach(file => {
const newPath = path.join(userFolder, path.basename(file.filename));
fs.renameSync(file.path, newPath);
logActivity(taskId, userId, 'FILE_UPLOADED', `Загружен файл: ${file.originalname}`);
});
const originalName = file.originalname;
db.run(
"INSERT INTO task_files (task_id, user_id, filename, original_name, file_path, file_size) VALUES (?, ?, ?, ?, ?, ?)",
[taskId, createdBy, path.basename(file.filename), originalName, newPath, file.size]
);
logActivity(taskId, createdBy, 'FILE_UPLOADED', `Загружен файл: ${originalName}`);
});
res.json({ success: true, message: 'Файлы успешно загружены' });
});
@@ -1332,7 +1341,30 @@ app.get('/api/files/:fileId/download', requireAuth, (req, res) => {
return res.status(404).json({ error: 'Файл не найден на сервере' });
}
res.download(file.file_path, file.original_name);
// Исправляем кодировку имени файла
let decodedFileName = file.original_name;
// Пробуем декодировать если это UTF-8 в Latin-1 (для старых записей)
try {
if (/^[A-Za-z0-9\.\-_]+$/.test(decodedFileName)) {
// Если имя содержит только латинские символы, оставляем как есть
} else if (decodedFileName.includes('Ð') || decodedFileName.includes('Ñ')) {
// Исправляем неправильно декодированную кириллицу
decodedFileName = Buffer.from(decodedFileName, 'binary').toString('utf8');
}
} catch (e) {
console.error('Ошибка декодирования имени файла:', e);
}
// Кодируем имя файла для безопасной передачи
const encodedFileName = encodeURIComponent(decodedFileName);
// Устанавливаем заголовки для скачивания
res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${encodedFileName}`);
res.setHeader('Content-Type', 'application/octet-stream');
// Отправляем файл
res.sendFile(file.file_path);
});
});
});