Letöltés erőltetése ismert fájltípus esetében is


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

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:

1
2
3
4
5
6
7
8
<?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:

1
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:

1
http://www.tutorial.hu/webszerkesztes/letoltes-eroltetese/almos.jpg
Kapcsolódó bejegyzések:
  • Webáruház fejlesztés közben jött a megrendelő kérése, hogy szeretné, ha a termék képek vízjellel lennének ellátva. Nos, hosszas keresés és kutakodás után, nem ta …

  • Az All in One SEO Pack az egyik legjobb SEO plugin amit manapság WordPress-hez lehet találni. Ami viszont nem tetszik benne, az …az, hogy a kategória o …

  • Ha arra van szükséged, hogy letöltött képeket és hangokat a böngésző ne mentse le a temp könyvtárba, használd az alábbi kódot:Ha azt akarod, …

  • Többen is gondolkodnak azon, hogyan is lehetne gyorsan és megbízhatóan átirányítani az oldalukat más internetes címre. A leírás több módszert is bemutatA …

  • Bizonyára már a legtöbben felfigyeltek arra, hogy a Microsoft Internet Explorer legutóbbi frissítése során egy új biztonsági funkcióval “gazdagodott” a böngésző …

A cikket beküldte: Harder (http://blog.harder.hu)

14 hozzászólás

  1. Harder says:

    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. Speeedfire says:

    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 says:

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

  4. Harder says:

    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.

  5. Speeedfire says:

    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.

  6. Harder says:

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

  7. Speeedfire says:

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

  8. N says:

    Mondjuk ha legalább beleraksz egy olyat, hogy

    1
    
    $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.

  9. Harder says:

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

  10. Geri says:

    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.

  11. Harder says:

    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. :)

  12. Geri says:
    
    

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

  13. Geri says:

    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;
  14. Harder says:

    Köszi Geri!

Szólj hozzá
a Letöltés erőltetése ismert fájltípus esetében is c. bejegyzéshez

- Engedélyezett HTML elemek: <a> <em> <strong> <ul> <ol> <li>
- Forráskód beküldéséhez tedd a kódot ezek közé: <pre lang="php" line="1">Kódrészlet helye itt</pre>