oazaSrdceWeb / admin / upload.php
upload.php
Raw
<?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();