From 5942bdf6c39a215394ffb379354a59eed0ecf3ff Mon Sep 17 00:00:00 2001 From: Rhino Date: Tue, 3 Mar 2026 10:25:37 +0100 Subject: [PATCH] Datei-Upload: Mehrfach-Upload mit Drag & Drop und Dateiliste MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Upload-Formular unterstützt jetzt mehrere Dateien gleichzeitig - Drag & Drop oder Klick zum Auswählen (mehrfach möglich) - Dateiliste mit Dateiname, Größe, individueller Kategorie-Auswahl und Entfernen-Button pro Datei - Standard-Kategorie kann oben gewählt werden, individuelle Kategorie pro Datei ist optional überschreibbar - Controller verarbeitet Array von Dateien (je max. 10 MB) - Übersetzungen in allen 6 Sprachen ergänzt Co-Authored-By: Claude Opus 4.6 --- app/Http/Controllers/Admin/FileController.php | 57 +++++--- lang/ar/admin.php | 6 + lang/de/admin.php | 6 + lang/en/admin.php | 6 + lang/pl/admin.php | 6 + lang/ru/admin.php | 6 + lang/tr/admin.php | 6 + resources/views/admin/files/create.blade.php | 126 ++++++++++++++---- 8 files changed, 174 insertions(+), 45 deletions(-) diff --git a/app/Http/Controllers/Admin/FileController.php b/app/Http/Controllers/Admin/FileController.php index dc5bcef..d7140ed 100644 --- a/app/Http/Controllers/Admin/FileController.php +++ b/app/Http/Controllers/Admin/FileController.php @@ -52,31 +52,52 @@ class FileController extends Controller } $request->validate([ - 'file' => ['required', 'file', 'max:10240', 'mimes:pdf,docx,xlsx,jpg,jpeg,png,gif,webp'], - 'file_category_id' => ['required', 'exists:file_categories,id'], + 'files' => ['required', 'array', 'min:1'], + 'files.*' => ['file', 'max:10240', 'mimes:pdf,docx,xlsx,jpg,jpeg,png,gif,webp'], + 'categories' => ['required', 'array', 'min:1'], + 'categories.*' => ['required', 'exists:file_categories,id'], ]); - $uploadedFile = $request->file('file'); - $extension = $uploadedFile->guessExtension(); - $storedName = Str::uuid() . '.' . $extension; + $uploadedFiles = $request->file('files', []); + $categories = $request->input('categories', []); + $count = 0; - Storage::disk('local')->putFileAs('files', $uploadedFile, $storedName); + foreach ($uploadedFiles as $index => $uploadedFile) { + if (!$uploadedFile || !$uploadedFile->isValid()) { + continue; + } - $file = new File([ - 'file_category_id' => $request->file_category_id, - 'original_name' => $uploadedFile->getClientOriginalName(), - 'mime_type' => $uploadedFile->getClientMimeType(), - 'size' => $uploadedFile->getSize(), - ]); - $file->stored_name = $storedName; - $file->disk = 'private'; - $file->uploaded_by = auth()->id(); - $file->save(); + $categoryId = $categories[$index] ?? null; + if (!$categoryId) { + continue; + } - ActivityLog::logWithChanges('uploaded', __('admin.log_file_uploaded', ['name' => $file->original_name]), 'File', $file->id, null, ['name' => $file->original_name, 'category' => $file->category->name ?? '']); + $extension = $uploadedFile->guessExtension(); + $storedName = Str::uuid() . '.' . $extension; + + Storage::disk('local')->putFileAs('files', $uploadedFile, $storedName); + + $file = new File([ + 'file_category_id' => $categoryId, + 'original_name' => $uploadedFile->getClientOriginalName(), + 'mime_type' => $uploadedFile->getClientMimeType(), + 'size' => $uploadedFile->getSize(), + ]); + $file->stored_name = $storedName; + $file->disk = 'private'; + $file->uploaded_by = auth()->id(); + $file->save(); + + ActivityLog::logWithChanges('uploaded', __('admin.log_file_uploaded', ['name' => $file->original_name]), 'File', $file->id, null, ['name' => $file->original_name, 'category' => $file->category->name ?? '']); + $count++; + } + + $message = $count === 1 + ? __('admin.file_uploaded') + : __('admin.files_uploaded', ['count' => $count]); return redirect()->route('admin.files.index') - ->with('success', __('admin.file_uploaded')); + ->with('success', $message); } public function destroy(File $file): RedirectResponse diff --git a/lang/ar/admin.php b/lang/ar/admin.php index 0df94a0..b5953b7 100755 --- a/lang/ar/admin.php +++ b/lang/ar/admin.php @@ -194,6 +194,12 @@ return [ 'files_title' => 'إدارة الملفات', 'upload_file' => 'رفع ملف', 'file_uploaded' => 'تم رفع الملف.', + 'upload_files' => 'رفع الملفات', + 'files_uploaded' => 'تم رفع :count ملفات.', + 'select_files' => 'اختيار الملفات', + 'drag_or_click_files' => 'اسحب الملفات هنا أو انقر للاختيار', + 'files_selected' => 'ملف(ات) محددة', + 'select_category_for_all' => 'يرجى اختيار فئة لجميع الملفات.', 'file_deleted' => 'تم حذف الملف.', 'file_category' => 'الفئة', 'select_category' => 'اختر الفئة', diff --git a/lang/de/admin.php b/lang/de/admin.php index 321b4d8..01f4d0f 100755 --- a/lang/de/admin.php +++ b/lang/de/admin.php @@ -225,6 +225,12 @@ return [ 'files_title' => 'Dateiverwaltung', 'upload_file' => 'Datei hochladen', 'file_uploaded' => 'Datei wurde hochgeladen.', + 'upload_files' => 'Dateien hochladen', + 'files_uploaded' => ':count Dateien wurden hochgeladen.', + 'select_files' => 'Dateien auswählen', + 'drag_or_click_files' => 'Dateien hierher ziehen oder klicken zum Auswählen', + 'files_selected' => 'Datei(en) ausgewählt', + 'select_category_for_all' => 'Bitte wählen Sie für alle Dateien eine Kategorie.', 'file_deleted' => 'Datei wurde gelöscht.', 'file_category' => 'Kategorie', 'select_category' => 'Kategorie wählen', diff --git a/lang/en/admin.php b/lang/en/admin.php index 6f520e5..131b215 100755 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -193,6 +193,12 @@ return [ 'files_title' => 'File Management', 'upload_file' => 'Upload File', 'file_uploaded' => 'File has been uploaded.', + 'upload_files' => 'Upload Files', + 'files_uploaded' => ':count files have been uploaded.', + 'select_files' => 'Select Files', + 'drag_or_click_files' => 'Drag files here or click to select', + 'files_selected' => 'file(s) selected', + 'select_category_for_all' => 'Please select a category for all files.', 'file_deleted' => 'File has been deleted.', 'file_category' => 'Category', 'select_category' => 'Select category', diff --git a/lang/pl/admin.php b/lang/pl/admin.php index 2ba8d4d..6b20062 100755 --- a/lang/pl/admin.php +++ b/lang/pl/admin.php @@ -194,6 +194,12 @@ return [ 'files_title' => 'Zarządzanie plikami', 'upload_file' => 'Prześlij plik', 'file_uploaded' => 'Plik został przesłany.', + 'upload_files' => 'Prześlij pliki', + 'files_uploaded' => 'Przesłano :count plików.', + 'select_files' => 'Wybierz pliki', + 'drag_or_click_files' => 'Przeciągnij pliki tutaj lub kliknij, aby wybrać', + 'files_selected' => 'plik(ów) wybranych', + 'select_category_for_all' => 'Proszę wybrać kategorię dla wszystkich plików.', 'file_deleted' => 'Plik został usunięty.', 'file_category' => 'Kategoria', 'select_category' => 'Wybierz kategorię', diff --git a/lang/ru/admin.php b/lang/ru/admin.php index b09e86d..dd4bcd4 100755 --- a/lang/ru/admin.php +++ b/lang/ru/admin.php @@ -212,6 +212,12 @@ return [ 'files_title' => 'Управление файлами', 'upload_file' => 'Загрузить файл', 'file_uploaded' => 'Файл был загружен.', + 'upload_files' => 'Загрузить файлы', + 'files_uploaded' => 'Загружено файлов: :count.', + 'select_files' => 'Выбрать файлы', + 'drag_or_click_files' => 'Перетащите файлы сюда или нажмите для выбора', + 'files_selected' => 'файл(ов) выбрано', + 'select_category_for_all' => 'Пожалуйста, выберите категорию для всех файлов.', 'file_deleted' => 'Файл был удалён.', 'file_category' => 'Категория', 'select_category' => 'Выберите категорию', diff --git a/lang/tr/admin.php b/lang/tr/admin.php index a352875..54d8055 100755 --- a/lang/tr/admin.php +++ b/lang/tr/admin.php @@ -212,6 +212,12 @@ return [ 'files_title' => 'Dosya Yönetimi', 'upload_file' => 'Dosya Yükle', 'file_uploaded' => 'Dosya yüklendi.', + 'upload_files' => 'Dosyaları Yükle', + 'files_uploaded' => ':count dosya yüklendi.', + 'select_files' => 'Dosyaları Seç', + 'drag_or_click_files' => 'Dosyaları buraya sürükleyin veya seçmek için tıklayın', + 'files_selected' => 'dosya seçildi', + 'select_category_for_all' => 'Lütfen tüm dosyalar için bir kategori seçin.', 'file_deleted' => 'Dosya silindi.', 'file_category' => 'Kategori', 'select_category' => 'Kategori seçin', diff --git a/resources/views/admin/files/create.blade.php b/resources/views/admin/files/create.blade.php index 541d43e..aa6c0f7 100644 --- a/resources/views/admin/files/create.blade.php +++ b/resources/views/admin/files/create.blade.php @@ -1,47 +1,119 @@

{{ __('admin.upload_file') }}

-
-
+
+ @csrf + {{-- Standard-Kategorie --}}
- - @foreach ($categories as $cat) - + @endforeach - @error('file_category_id')

{{ $message }}

@enderror
+ {{-- Drag & Drop Zone --}}
- -
-
- - - -

{{ __('admin.allowed_file_types') }}

-

{{ __('admin.max_file_size') }}

-

-
- + +
+ + + +

{{ __('admin.drag_or_click_files') }}

+

{{ __('admin.allowed_file_types') }} · {{ __('admin.max_file_size') }}

+

- @error('file')

{{ $message }}

@enderror + + @error('files')

{{ $message }}

@enderror + @error('files.*')

{{ $message }}

@enderror + @error('categories')

{{ $message }}

@enderror + @error('categories.*')

{{ $message }}

@enderror
+ {{-- Datei-Liste --}} + + + {{-- Hidden Inputs für tatsächlichen Upload --}} + +
- + {{ __('ui.cancel') }}