false, 'error' => 'Método no permitido']); exit; } $allowedMimes = [ // Imágenes 'image/jpeg' => 'jpg', 'image/png' => 'png', 'image/webp' => 'webp', 'image/gif' => 'gif', // Documentos 'application/pdf' => 'pdf', 'application/msword' => 'doc', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx', 'application/vnd.ms-excel' => 'xls', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx', 'text/plain' => 'txt', 'text/csv' => 'csv', ]; // Normalizar: acepta 'file' (uno) o 'files[]' (varios) $incoming = []; if (!empty($_FILES['files']['name'][0])) { // múltiples for ($i = 0; $i < count($_FILES['files']['name']); $i++) { $incoming[] = [ 'name' => $_FILES['files']['name'][$i], 'tmp_name' => $_FILES['files']['tmp_name'][$i], 'error' => $_FILES['files']['error'][$i], 'size' => $_FILES['files']['size'][$i], ]; } } elseif (!empty($_FILES['file']['tmp_name'])) { $incoming[] = [ 'name' => $_FILES['file']['name'], 'tmp_name' => $_FILES['file']['tmp_name'], 'error' => $_FILES['file']['error'], 'size' => $_FILES['file']['size'], ]; } if (empty($incoming)) { echo json_encode(['success' => false, 'error' => 'No se recibieron archivos']); exit; } $uploadDir = __DIR__ . '/../../uploads/media'; if (!is_dir($uploadDir)) { @mkdir($uploadDir, 0755, true); } $resultado = []; $finfo = finfo_open(FILEINFO_MIME_TYPE); foreach ($incoming as $file) { if ($file['error'] !== UPLOAD_ERR_OK) { echo json_encode(['success' => false, 'error' => "Error al recibir archivo: código {$file['error']}"]); finfo_close($finfo); exit; } if ($file['size'] > 10 * 1024 * 1024) { echo json_encode(['success' => false, 'error' => "El archivo '{$file['name']}' supera 10 MB"]); finfo_close($finfo); exit; } $mime = finfo_file($finfo, $file['tmp_name']); if (!isset($allowedMimes[$mime])) { echo json_encode(['success' => false, 'error' => "Tipo no permitido ($mime). Imágenes, PDF o documentos Office."]); finfo_close($finfo); exit; } $ext = $allowedMimes[$mime]; $newName = 'nota_' . date('Ymd_His') . '_' . bin2hex(random_bytes(4)) . '.' . $ext; $dest = realpath($uploadDir) . '/' . $newName; if (!move_uploaded_file($file['tmp_name'], $dest)) { echo json_encode(['success' => false, 'error' => 'Error al guardar el archivo en el servidor']); finfo_close($finfo); exit; } $nombreOriginal = mb_substr(preg_replace('/[^\w.\-áéíóúÁÉÍÓÚñÑ ]/u', '', $file['name']), 0, 100); $resultado[] = [ 'nombre' => $nombreOriginal ?: $newName, 'path' => $newName, 'mime' => $mime, 'size' => $file['size'], ]; } finfo_close($finfo); echo json_encode([ 'success' => true, 'archivos' => $resultado, // retrocompatibilidad: si solo fue uno, devolver también imagen_path 'imagen_path'=> count($resultado) === 1 ? $resultado[0]['path'] : null, ]);