<?php
/**
* @file upload.php
* @brief Nahrání nové úvodní fotky na server a do databáze.
*
* Tento skript přijímá soubor obrázku přes POST požadavek (multipart/form-data).
* Provádí kontrolu typu, velikosti a existence souboru.
* Pokud je obrázek označen jako hlavní, nastaví všechny ostatní fotky jako nehlavní.
* Po úspěšném nahrání uloží informace o fotce do databáze.
* Výsledek vrací ve formátu JSON.
* Přístup je povolen pouze přes administraci.
*/
include '../db_connection.php'; ///< Připojení k databázi.
$conn->set_charset("utf8mb4");
// Nastaví hlavičku odpovědi na JSON
header('Content-Type: application/json');
// Zkontroluje a nastaví data
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_FILES['fileToUpload']) && $_FILES['fileToUpload']['error'] == UPLOAD_ERR_OK) {
$originalFileName = basename($_FILES['fileToUpload']['name']);
$targetDir = "../media/";
$targetFile = $targetDir . $originalFileName;
$ismain = $_POST['new'];
$dbDir = "media/" . $originalFileName;
$name = $_POST['photoName'];
// Kontrola, zda soubor již existuje
if (file_exists($targetFile)) {
echo json_encode(['success' => false, 'error' => 'Soubor s tímto názvem již existuje.']);
exit();
}
// Kontrola povolených typů souborů
$imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
$allowedTypes = array("jpg", "jpeg", "png", "gif", "webp");
if (!in_array($imageFileType, $allowedTypes)) {
echo json_encode(['success' => false, 'error' => 'Pouze JPG, JPEG, PNG, GIF a WEBP soubory jsou povoleny.']);
exit();
}
// Kontrola velikosti souboru (max 5MB)
if ($_FILES['fileToUpload']['size'] > 5000000) {
echo json_encode(['success' => false, 'error' => 'Soubor je příliš velký. Maximální velikost je 5MB.']);
exit();
}
// Pokud je nově nahraná fotka nastavena jako hlavní, ostatní nastaví jako nehlavní
if ($ismain == 1) {
$sql = "UPDATE mainphoto SET ismain = 2";
$conn->query($sql);
}
// Přesune nahraný soubor do cílové složky
if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $targetFile)) {
$sql = "INSERT INTO mainphoto (name, photo_link, ismain) VALUES (?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssi", $name, $dbDir, $ismain);
if ($stmt->execute()) {
echo json_encode(['success' => true, 'message' => 'Obrázek byl úspěšně nahrán.']);
} else {
// Pokud selže zápis do databáze, smaže nahraný soubor
unlink($targetFile);
echo json_encode(['success' => false, 'error' => 'Chyba při ukládání do databáze: ' . $conn->error]);
}
} else {
echo json_encode(['success' => false, 'error' => 'Nepodařilo se uložit nahraný soubor.']);
}
} else {
// Zpracování možných chyb při nahrávání souboru
$error_message = 'Žádný obrázek nebyl nahrán nebo došlo k chybě.';
if (isset($_FILES['fileToUpload']['error'])) {
switch ($_FILES['fileToUpload']['error']) {
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
$error_message = 'Soubor je příliš velký.';
break;
case UPLOAD_ERR_PARTIAL:
$error_message = 'Soubor byl nahrán pouze částečně.';
break;
case UPLOAD_ERR_NO_FILE:
$error_message = 'Nebyl vybrán žádný soubor.';
break;
}
}
echo json_encode(['success' => false, 'error' => $error_message]);
}
} else {
echo json_encode(['success' => false, 'error' => 'Neplatná metoda požadavku.']);
}
$conn->close();