Datei-Upload: Mehrfach-Upload mit Drag & Drop und Dateiliste

- 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 <noreply@anthropic.com>
This commit is contained in:
Rhino
2026-03-03 10:25:37 +01:00
parent 28beb99896
commit 5942bdf6c3
8 changed files with 174 additions and 45 deletions

View File

@@ -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