10 * 1024 * 1024) { v2_response_error(413, 'file_too_large', 'Max 10 MB pro Upload.'); } // Ablage $uploadDir = V2_ROOT . "/uploads/$slug/student-$studentId"; if (!is_dir($uploadDir)) { if (!mkdir($uploadDir, 0775, true)) { v2_response_error(500, 'upload_dir_failed', 'Upload-Ordner konnte nicht erstellt werden.'); } } $ext = pathinfo($file['name'], PATHINFO_EXTENSION) ?: 'bin'; $ext = preg_replace('/[^a-zA-Z0-9]/', '', $ext); $filename = sprintf('%s-%s.%s', date('Ymd-His'), bin2hex(random_bytes(4)), $ext); $destPath = "$uploadDir/$filename"; $publicUrl = V2_BASE_URL . "/uploads/$slug/student-$studentId/$filename"; if (!move_uploaded_file($file['tmp_name'], $destPath)) { v2_response_error(500, 'move_failed', 'Datei konnte nicht abgelegt werden.'); } v2_db_exec(" INSERT INTO artifacts_v2 (student_id, module_slug, mime_type, url, label, bytes) VALUES (:sid, :slug, :mt, :url, :lbl, :b) ", [ ':sid' => $studentId, ':slug' => $slug, ':mt' => $mimeType, ':url' => $publicUrl, ':lbl' => $label, ':b' => (int) $file['size'], ]); $id = (int) v2_db_insert_id(); v2_response_created([ 'id' => $id, 'url' => $publicUrl, 'thumbnail' => null, // TODO: Thumbnail-Generation für Bilder ]);