cyla/api.php

75 lines
2.4 KiB
PHP

<?php
define('CYLA_CORE', true);
require_once 'core.php';
// Augmenter la limite de temps d'exécution pour les uploads multiples
set_time_limit(300); // 5 minutes
// Vérifier si l'utilisateur est connecté
if (!Cyla::isLoggedIn()) {
header('Content-Type: application/json');
http_response_code(401);
echo json_encode(['error' => 'Non autorisé']);
exit;
}
// Vérifier le token CSRF
if (!isset($_POST['csrf_token']) || !Cyla::verifyCSRFToken($_POST['csrf_token'])) {
header('Content-Type: application/json');
http_response_code(403);
echo json_encode(['error' => 'Token CSRF invalide']);
exit;
}
// Gérer l'upload de fichier
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
header('Content-Type: application/json');
try {
// Vérification de l'espace disque disponible
$uploadDir = UPLOAD_DIR;
$freeSpace = disk_free_space($uploadDir);
if ($freeSpace < $_FILES['file']['size']) {
throw new Exception('Espace disque insuffisant');
}
$validation = Cyla::validateUpload($_FILES['file']);
if (!$validation['valid']) {
throw new Exception($validation['error']);
}
$filename = Cyla::generateUniqueFilename($_FILES['file']['name']);
$destination = $uploadDir . $filename;
// Upload avec gestion de la mémoire
if (!move_uploaded_file($_FILES['file']['tmp_name'], $destination)) {
throw new Exception('Erreur lors du déplacement du fichier');
}
// Vérifier l'intégrité du fichier
if (!file_exists($destination) || filesize($destination) !== $_FILES['file']['size']) {
unlink($destination); // Nettoyer en cas d'erreur
throw new Exception('Erreur d\'intégrité du fichier');
}
echo json_encode([
'success' => true,
'file' => [
'name' => $filename,
'size' => filesize($destination),
'url' => 'share.php?file=' . urlencode($filename)
]
]);
} catch (Exception $e) {
http_response_code(400);
echo json_encode([
'error' => $e->getMessage(),
'details' => error_get_last()
]);
}
exit;
}
// Méthode non autorisée
http_response_code(405);
echo json_encode(['error' => 'Méthode non autorisée']);