PHP - Download (preuzimanje) datoteka


Preuzimanje datoteka sa PHP-om

Obično ne morate nužno koristiti bilo koji skriptni jezik na strani servera, kao što je PHP, za preuzimanje slika, zip datoteka, pdf dokumenata, exe datoteka itd. Ako se takva vrsta datoteke čuva u javno dostupnoj mapi, možete jednostavno stvoriti hipervezu koja upućuje na tu datoteku i svaki put kada korisnik klikne na vezu, pretraživač će automatski preuzeti tu datoteku.

<a href="downloads/test.zip">Download Zip file</a>
<a href="downloads/masters.pdf">Download PDF file</a>
<a href="downloads/sample.jpg">Download Image file</a>
<a href="downloads/setup.exe">Download EXE file</a>
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>HTML Linkovi za preuzimanje sadržaja</title>
</head>
<body>
    <p><a href="/examples/downloads/test.zip">Download Zip file</a></p>
    <p><a href="/examples/downloads/masters.pdf">Download PDF file</a></p>
    <p><a href="/examples/downloads/sample.jpg">Download Image file</a></p>
</body>
</html>

Klik na vezu koja upućuje na PDF ili slikovnu datoteku neće uzrokovati njeno direktno preuzimanje na vaš tvrdi (hard) disk. Datoteku će otvoriti samo u vašem pretraživaču. Dalje ga možete sačuvati na tvrdom (hard) disku. Međutim, zip i exe datoteke se automatski preuzimaju na tvrdi (hard) disk.



Prisiljavanje na preuzimanje pomoću PHP-a

Možete prisiliti slike ili druge vrste datoteka da se preuzmu direktno na korisnički disk koristeći PHP funkciju readfile(). Ovdje ćemo stvoriti jednostavnu galeriju slika koja omogućava korisnicima da preuzmu slikovne datoteke iz pretraživača jednim klikom miša. Kreirajmo datoteku pod nazivom "image-gallery.php" i u nju stavimo sljedeći kod.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jednostavna galerija slika</title>
<style type="text/css">
    .img-box{
        display: inline-block;
        text-align: center;
        margin: 0 15px;
    }
</style>
</head>
<body>
    <?php
    // Niz koji sadrži uzorke imena datoteka slika
    $images = array("kites.jpg", "balloons.jpg");
    
    // Prelistajte niz da biste kreirali galeriju slika
    foreach($images as $image){
        echo '<div class="img-box">';
            echo '<img src="images/' . $image . '" width="200" 
            alt="' .  pathinfo($image, PATHINFO_FILENAME) .'">';
            echo '<p><a href="download.php?file=' . urlencode($image) . '">Download</a></p>';
        echo '</div>';
    }
    ?>
</body>
</html>

Ako pažljivo vidite gornji primjer koda, naći ćete vezu za preuzimanje koja se nalazi u datoteci "download.php", URL sadrži i ime datoteke slike kao niz upita. Takođe koristili smo PHP funkciju urlencode() za kodiranje imena slikovnih datoteka tako da se mogu sigurno proslijediti kao parametar URL-a, jer imena datoteka mogu da sadrže URL-ove koji nisu sigurni. Evo kompletnog koda datoteke "download.php", koja prisiljava preuzimanje slike.

<?php
if(isset($_REQUEST["file"])){
    // Preuzmi parametre
    $file = urldecode($_REQUEST["file"]); // Dekodiranje niza kodiranog URL-om

    /* Testirajte sadrži li naziv datoteke nedozvoljene znakove
     kao što su "../" koristeći regularni izraz */
    if(preg_match('/^[^.][-a-z0-9_.]+[a-z]$/i', $file)){
        $filepath = "images/" . $file;

        // Proces preuzimanja (download)
        if(file_exists($filepath)) {
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($filepath));
            flush(); // Ispiranje izlaznog međuspremnika sistema
            readfile($filepath);
            die();
        } else {
            http_response_code(404);
          die();
        }
    } else {
        die("Nevažeće ime datoteke!");
    }
}
?>

Slično tome, možete prisilno preuzeti druge formate datoteka kao što su word doc, pdf datoteke itd. Regularni izraz u gornjem primjeru jednostavno neće dopustiti one datoteke čije ime započinje ili završava tačkom (.), Na primjer, dopušta imena datoteka kao što su kites.jpg ili Kites.jpg myscript.min.js, ali ne dozvoljavaju kites.jpg. ili .kites.jpg.