1
0

Добавлена загрузка rar, zip

1. Правка фронта
2. Правка бекенда
This commit is contained in:
2026-01-12 07:01:31 +07:00
parent 61c336b703
commit b4263bfe3f
5 changed files with 117 additions and 28 deletions

View File

@@ -128,7 +128,7 @@ class Task extends BaseEntity {
self::check_task($id);
// Удаляем папку с файлами если есть
$upload_dir = __DIR__ . '/../../../public/img/task/' . $id;
$upload_dir = __DIR__ . '/../../../public/task/' . $id;
if (is_dir($upload_dir)) {
$files = glob($upload_dir . '/*');
foreach ($files as $file) {

View File

@@ -3,24 +3,24 @@
class TaskImage {
protected static $db_name = 'cards_task';
protected static $upload_path = '/public/img/task/';
protected static $upload_path = '/public/task/';
// Валидация всех данных для загрузки
protected static function validate($task_id, $file_base64, $file_name) {
// Проверка и получение задачи
$task = Task::check_task($task_id);
// Декодируем base64
$file_data = base64_decode(preg_replace('/^data:image\/\w+;base64,/', '', $file_base64));
// Декодируем base64 (убираем любой data: префикс)
$file_data = base64_decode(preg_replace('/^data:[^;]+;base64,/', '', $file_base64));
if (!$file_data) {
return ['success' => false, 'errors' => ['file' => 'Ошибка декодирования файла']];
}
// Проверка расширения
$allowed_ext = ['png', 'jpg', 'jpeg'];
$allowed_ext = ['png', 'jpg', 'jpeg', 'zip', 'rar'];
$ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
if (!in_array($ext, $allowed_ext)) {
return ['success' => false, 'errors' => ['file' => 'Разрешены только PNG, JPG, JPEG']];
return ['success' => false, 'errors' => ['file' => 'Разрешены только PNG, JPG, JPEG, ZIP, RAR']];
}
// Проверка размера (10 МБ)
@@ -29,18 +29,11 @@ class TaskImage {
return ['success' => false, 'errors' => ['file' => 'Файл слишком большой. Максимум 10 МБ']];
}
// Проверка MIME типа
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->buffer($file_data);
$allowed_mime = ['image/png', 'image/jpeg'];
if (!in_array($mime, $allowed_mime)) {
return ['success' => false, 'errors' => ['file' => 'Недопустимый тип файла']];
}
// Всё ок — возвращаем данные
return [
'task' => $task,
'file_data' => $file_data
'file_data' => $file_data,
'is_archive' => in_array($ext, ['zip', 'rar'])
];
}
@@ -69,7 +62,7 @@ class TaskImage {
$file_data = $validation['file_data'];
// Путь к папке
$upload_dir = __DIR__ . '/../../../public/img/task/' . $task_id;
$upload_dir = __DIR__ . '/../../../public/task/' . $task_id;
if (!is_dir($upload_dir)) {
mkdir($upload_dir, 0755, true);
}
@@ -123,7 +116,7 @@ class TaskImage {
// Получаем текущие файлы
$current_files = json_decode($task['file_img'], true) ?? [];
$upload_dir = __DIR__ . '/../../../public/img/task/' . $task_id;
$upload_dir = __DIR__ . '/../../../public/task/' . $task_id;
$deleted = [];
// Удаляем каждый файл

View File

@@ -1,9 +1,26 @@
<?php
// Игнорирование статических файлов
function ignore_favicon() {
// Обработка статических файлов
function routing_static_files() {
$requestUri = $_SERVER['REQUEST_URI'] ?? '';
if (preg_match('/\.(ico|png|jpg|jpeg|gif|css|js|svg|woff|woff2|ttf|eot)$/i', $requestUri)) {
$path = parse_url($requestUri, PHP_URL_PATH);
// Отдача файлов из /public/ (принудительное скачивание)
if (strpos($path, '/public/') === 0) {
$file = dirname(dirname(__DIR__)) . $path;
if (is_file($file)) {
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
readfile($file);
exit;
}
http_response_code(404);
exit;
}
// Игнорирование favicon и прочих статических запросов
if (preg_match('/\.(ico|css|js|woff|woff2|ttf|eot)$/i', $requestUri)) {
http_response_code(404);
exit;
}