Felmerült ma délután egy kérdés és mivel hirtelen én sem tudtam rá a pontos választ, utánanéztem. A kérdés az alábbi volt: hogy lehet a böngészőt letöltési ablak feldobására kényszeríteni még olyan fájltípusok esetében is, amikor egyébként a böngésző, vagy egy másik program automatikusan megnyitná azt?

Álmos a rövid szőrű magyar vizsla
Álmos a rövid szőrű magyar vizsla

A példa kedvéért egy jpg fájlon próbáltam ki a módszert. A megoldás lényege egy apró PHP fájl amit a letöltésre felkínált fájllal egy könyvtárba kell elhelyezni. A PHP fájl tartalma ennyi lenne:

<?php
$file = str_replace('../','',$_GET['file']);
header ("Content-type: octet/stream");
header ("Content-disposition: attachment; filename=".$file.";");
header("Content-Length: ".filesize($file));
readfile($file);
exit;
?>

Ez a fenti kódot letoltes.php néven mentettem el a példában. Ez után az alábbi URL-lel lehet a fenti képet meghivatkozni, ha szeretnénk, hogy a képet mindenképpen letöltésre kínálja fel:

http://www.tutorial.hu/webszerkesztes/letoltes-eroltetese/letoltes.php?file=almos.jpg

A kép a hagyományos módon linkelve természetesen megjelenne a böngészőben:

http://www.tutorial.hu/webszerkesztes/letoltes-eroltetese/almos.jpg
Harder

Harder

Profil

Korábbi hozzászólások (14)

A régi blogon érkezett hozzászólások archívuma. Új hozzászólást már nem lehet írni.

  1. Harderszerzőblog.harder.hu

    Ha van egyébként más megoldás is, írjátok meg, én szívesen elolvasnám és szerintem a többi olvasó is örülne neki.

  2. Speeedfiretothszabi.info

    Nincs rá más megoldás szerintem, én is ezt használom. Bár egy file_exists elférne a GET[] után.

  3. b

    Ezt így ilyen formában levenném a szerverről ( http://www.tutorial.hu/webszerkesztes/letoltes-eroltetese/letoltes.php?file=letoltes.php ) :)

    1. Harderszerzőblog.harder.hu

      Miért, ennek mi a veszélye? Ha csak annyi, hogy ezt a fájlt le lehet tölteni a szerverről, az nem gond, hiszen a kódja itt van a leírásban is.

  4. Speeedfiretothszabi.info

    Hát, ha másik php fájlt ad meg, ahol mondjuk vannak olyan kódrészek, amik kritikusok a rendszerre nézve, az már necces.

  5. Harderszerzőblog.harder.hu

    Köszi, töröltem a fájlt és módosítottam a leírást. :)

  6. Speeedfiretothszabi.info

    Inkább valami regexp-et kellett volna rá írni, ami csak a média fájlokat engedélyezi. Csak kiterjesztéseket néz.

  7. N

    Mondjuk ha legalább beleraksz egy olyat, hogy

    $file = str_replace('../','',$_GET['file']);

    Akkor azt elkerülöd, hogy kilépjen a mappából és nem fogja például a cms adatbázis configját tartalmazó php-t letölteni.

  8. Harderszerzőblog.harder.hu

    Köszi, már cseréltem is a kódban, jó ötlet!

  9. Geridev.elopment.net

    Ez meg mindig nem az igazi, mert ha kitalalja valaki a konyvtarstrukturat akkor meg mindig hozzafer barmihez. Ilyen GET parameteres letoltest ugy erdemes kivitelezni, hogy van egy adott fajlhalmaz amibol le lehet tolteni. Ezt tarolhatod adatbazisban, vagy akar egy tombben. Esetleg meg ugy hogy a GET parameternek csak az utolso / jel utani reszet veszed figyelembe es prefixeled azzal a mappaval amiben a szabadon hozzaferheto fajlok vannak.

  10. Harderszerzőblog.harder.hu

    Köszi, értem a problémát, szerencsére még akkor egyből le is vettem ezt a megoldást a szerverről, így itt nem lehet kihasználni. A fájltárolásos szűrés jó ötletnek tűnik, főleg ha ki lehet vitelezni mondjuk egy akármilyen nevű txt fájllal is, hogy ne kelljen esetleg 1-2 db fájl miatt adatbázisban és phpmyadmin-on turkálni. :)

  11. Geridev.elopment.net

    A fenti peldaban csak a $file_list tombot kell kiegesziteni. Nem tul kenyelmes megoldas, de biztonsagos.

  12. Geridev.elopment.net

    hm... valamiert nem tudom a kodot beilleszteni :). talan igy.

    $file = str_replace('../','',$_GET['file']);
    $file_list = array('file1.jpg', 'file2.jpg');
    if(!in_array($file, $file_list))die('File not found.');
    header ("Content-type: octet/stream");
    header ("Content-disposition: attachment; filename=".$file.";");
    header("Content-Length: ".filesize($file));
    readfile($file);
    exit;

    1. Harderszerzőblog.harder.hu

      Köszi Geri!

Van hozzáfűznivalód? Írj nekem közvetlenül.

Kapcsolat