PHP - Upload (otpremanje) podataka


Uploading (Otpremanje) datoteka pomoću PHP-a

U ovoj lekciji naučićemo kako prenositi datoteke na udaljeni server pomoću jednostavnog HTML obrasca i PHP-a. Možete otpremiti bilo koju vrstu datoteke poput slika, videozapisa, ZIP datoteka, Microsoft Office dokumenata, PDF-ova, kao i izvršne datoteke i širok spektar drugih vrsta datoteka.


Korak 1: Stvaranje HTML obrasca za otpremanje datoteke

Sljedeći će primjer stvoriti jednostavan HTML obrazac koji se može koristiti za prenos datoteka.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload forma</title>
</head>
<body>
    <form action="upload-manager.php" method="post" enctype="multipart/form-data">
        <h2>Upload dokumenta</h2>
        <label for="fileSelect">Ime dokumenta:</label>
        <input type="file" name="photo" id="fileSelect">
        <input type="submit" name="submit" value="Upload">
        <p><strong>Napomena:</strong> Samo .jpg, .jpeg, .gif, .png je dozvoljeni formati 
        do maksimalne veličine 5 MB.</p>
    </form>
</body>
</html>

Korak 2: Obrada otpremljene datoteke

Evo kompletnog koda naše datoteke "upload-manager.php". Učitana datoteka pohraniće se trajno u mapu "upload", kao i implementovati neke osnovne sigurnosne provjere poput tipa datoteke i veličine datoteke kako bi se osiguralo da korisnici prenose ispravnu vrstu datoteke i unutar dozvoljenog ograničenja.

<?php
// Provjerite je li obrazac poslan
if($_SERVER["REQUEST_METHOD"] == "POST"){
    // Provjerite je li datoteka prenesena bez grešaka
    if(isset($_FILES["photo"]) && $_FILES["photo"]["error"] == 0){
        $allowed = array("jpg" => "image/jpg", "jpeg" => "image/jpeg", "gif" => 
        "image/gif", "png" => "image/png");
        $filename = $_FILES["photo"]["name"];
        $filetype = $_FILES["photo"]["type"];
        $filesize = $_FILES["photo"]["size"];
    
        // Potvrdite ekstenziju datoteke
        $ext = pathinfo($filename, PATHINFO_EXTENSION);
        if(!array_key_exists($ext, $allowed)) die("Error: Odaberite važeći format datoteke.");
    
        // Provjerite veličinu datoteke - 5MB maksimalno
        $maxsize = 5 * 1024 * 1024;
        if($filesize > $maxsize) die("Error: Veličina datoteke je veća od dozvoljenog ograničenja.");
    
        // Provjerite MIME tip datoteke
        if(in_array($filetype, $allowed)){
            // Prije otpremanja provjerite postoji li datoteka
            if(file_exists("upload/" . $filename)){
                echo $filename . " već postoji.";
            } else{
                move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $filename);
                echo "Vaša datoteka je uspješno prenesena.";
            } 
        } else{
            echo "Error: Došlo je do problema pri prenosu vaše datoteke. Molimo pokušajte ponovo."; 
        }
    } else{
        echo "Error: " . $_FILES["photo"]["error"];
    }
}
?>

Možda se pitate o čemu se radi u ovom kodu. Pa, prođimo svaki dio ovoga primjera koda jedan po jedan red, radi boljeg razumijevanja ovog procesa.



Objašnjenje koda

Jednom kada se obrazac pošalje, informacijama o učitanoj datoteci može se pristupiti preko PHP superglobalnog niza zvanog $_FILES. Na primjer, naš obrazac za prenos sadrži polje za odabir datoteke nazvano photo (tj. name = "photo"). Ako je bilo koji korisnik učitao datoteku pomoću ovog polja, možemo dobiti njegove detalje kao što su ime, vrsta, veličina, privremeno ime ili greška, ukoliko je došlo do nje prilikom pokušaja prenosa putem asocijativnog niza $_FILES["photo"], poput ovog:

  • $_FILES["photo"]["name"] - Ova vrijednost niza navodi izvorno ime datoteke, uključujući ekstenziju datoteke. Ne uključuje putanju datoteke.
  • $_FILES["photo"]["name"] - Ova vrijednost niza određuje MIME tip datoteke.
  • $_FILES["photo"]["size"] - Ova vrijednost niza određuje veličinu datoteke, u bajtovima.
  • $_FILES["photo"]["tmp_name"] - Ova vrijednost niza navodi privremeno ime, uključujući punu putanju koji je dodijeljen datoteci nakon što je prenesena na server.
  • $_FILES["photo"]["error"] - Ova vrijednost niza navodi grešku ili statusni kod povezan sa otpremanjem datoteke, npr. biće 0, ako nema greške.

PHP kod u sljedećem primjeru jednostavno će prikazati detalje učitane datoteke i pohraniti je u privremeni direktorij na web serveru.

<?php
if($_FILES["photo"]["error"] > 0){
    echo "Error: " . $_FILES["photo"]["error"] . "<br>";
} else{
    echo "File Name: " . $_FILES["photo"]["name"] . "<br>";
    echo "File Type: " . $_FILES["photo"]["type"] . "<br>";
    echo "File Size: " . ($_FILES["photo"]["size"] / 1024) . " KB<br>";
    echo "Stored in: " . $_FILES["photo"]["tmp_name"];
}
?>