From cc08cdbc97884067eb39cfbd6f4d7023b1a4ca42 Mon Sep 17 00:00:00 2001 From: F4ilji Date: Fri, 18 Sep 2026 01:32:34 +0500 Subject: [PATCH] fix: 405 error on schedule upload/edit - Edit.vue: move _method PUT from Inertia options to FormData (Inertia v2 ignores it in options) - Upload.vue: add forceFormData: true for reliable multipart/form-data - AccessCheck: add logging when abort() is triggered with non-200 code - UploadSchedulesController: add request logging for diagnostics - php.ini: increase max_file_uploads from 20 to 50 for bulk uploads --- _docker/app/php.ini | 1 + .../WEB/Controllers/UploadSchedulesController.php | 13 +++++++++++++ app/Http/Middleware/AccessCheck.php | 8 ++++++++ resources/js/Pages/Dashboard/Schedules/Edit.vue | 4 +++- resources/js/Pages/Dashboard/Schedules/Upload.vue | 1 + 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/_docker/app/php.ini b/_docker/app/php.ini index 8e5bc2c..bcdf3ae 100755 --- a/_docker/app/php.ini +++ b/_docker/app/php.ini @@ -1,5 +1,6 @@ post_max_size = 128M upload_max_filesize = 128M +max_file_uploads = 50 ; OPTIMIZATION: Увеличен лимит памяти для обработки больших IMAP-сообщений ; Предыдущая ошибка: 256MB было недостаточно для загрузки всех писем diff --git a/app/Containers/Dashboard/UI/WEB/Controllers/UploadSchedulesController.php b/app/Containers/Dashboard/UI/WEB/Controllers/UploadSchedulesController.php index 0a9de07..c3f4af5 100644 --- a/app/Containers/Dashboard/UI/WEB/Controllers/UploadSchedulesController.php +++ b/app/Containers/Dashboard/UI/WEB/Controllers/UploadSchedulesController.php @@ -5,6 +5,7 @@ namespace App\Containers\Dashboard\UI\WEB\Controllers; use App\Containers\Dashboard\Actions\Schedules\UploadMultipleSchedulesAction; use App\Http\Controllers\Controller; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; use Inertia\Inertia; class UploadSchedulesController extends Controller @@ -18,6 +19,10 @@ class UploadSchedulesController extends Controller */ public function create(): \Inertia\Response { + Log::info('UploadSchedules: create called', [ + 'method' => request()->method(), + 'user_id' => request()->user()?->id, + ]); return Inertia::render('Dashboard/Schedules/Upload'); } @@ -26,6 +31,14 @@ class UploadSchedulesController extends Controller */ public function store(Request $request): \Inertia\Response { + Log::info('UploadSchedules: store called', [ + 'method' => $request->method(), + 'content_type' => $request->header('Content-Type'), + 'files_count' => count($request->file('files', [])), + 'has_inertia_header' => $request->header('X-Inertia') ? 'yes' : 'no', + 'user_id' => $request->user()?->id, + ]); + // Получаем файлы из request (FormData с files[]) $files = $request->file('files', []); diff --git a/app/Http/Middleware/AccessCheck.php b/app/Http/Middleware/AccessCheck.php index b5d2e46..557b16d 100755 --- a/app/Http/Middleware/AccessCheck.php +++ b/app/Http/Middleware/AccessCheck.php @@ -5,6 +5,7 @@ namespace App\Http\Middleware; use App\Containers\AppStructure\Models\Page; use Closure; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; use Symfony\Component\HttpFoundation\Response; class AccessCheck @@ -28,6 +29,13 @@ class AccessCheck // Если код не 200, возвращаем соответствующий код ошибки if ($registeredRoute->code != 200) { + Log::warning('AccessCheck: abort', [ + 'uri' => $request->route()->uri, + 'method' => $request->method(), + 'page_id' => $registeredRoute->id, + 'code' => $registeredRoute->code, + 'path' => $registeredRoute->path, + ]); abort($registeredRoute->code); } diff --git a/resources/js/Pages/Dashboard/Schedules/Edit.vue b/resources/js/Pages/Dashboard/Schedules/Edit.vue index c7dd7f9..23be6f2 100644 --- a/resources/js/Pages/Dashboard/Schedules/Edit.vue +++ b/resources/js/Pages/Dashboard/Schedules/Edit.vue @@ -320,8 +320,10 @@ export default { formData.append('file[0][path]', this.form.file[0].path); } + formData.append('_method', 'PUT'); + this.$inertia.post(route('dashboard.schedules.update', this.schedule.id), formData, { - _method: 'PUT', + forceFormData: true, onFinish: () => { this.processing = false; }, diff --git a/resources/js/Pages/Dashboard/Schedules/Upload.vue b/resources/js/Pages/Dashboard/Schedules/Upload.vue index 1bc832f..c088d0a 100644 --- a/resources/js/Pages/Dashboard/Schedules/Upload.vue +++ b/resources/js/Pages/Dashboard/Schedules/Upload.vue @@ -440,6 +440,7 @@ export default { }); this.$inertia.post(route('dashboard.schedules.upload.store'), formData, { + forceFormData: true, preserveScroll: true, onError: (errors) => { this.errors = { ...errors };