r
This commit is contained in:
84
server.js
84
server.js
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user