Php ile dosya indirmek (Güncellendi)

Bir resim indireceğiniz zaman ne yaparsınız? Resme sağ tıkla farklı kaydet. Peki bunu ziyaretçi için kolaylaştırmaya ne dersiniz?

Sadece resim değil her türden içeriği bir tıklama ile kullanıcının bilgisayarına indirebiliriz. Bunun için şu küçük uygulamayı inceleyebilirsiniz.

Kodlara gelince


<html>
<head>
<title>PHP ile dosya indirmek</title>
</head>
<body>
<h1>PHP ile dosya indirmek</h1>
<h2>Önce 1 numaraya tıklayıp resmi indirmeye çalışın,sonra 2 numaraya tıklayıp indirin!</h2>
<?
$resim['tur']=base64_encode("image/jpeg");
$resim['yol']=base64_encode("resim.jpg");

?>
1- <a href="resim.jpg">Resmi İndir</a> <br />
2- <a href="indir.php?indir=<?=$resim['yol']."&tur=".$resim['tur']?>">Resmi İndir</a> <br /><br />

</body>
</html>

Bir dizi oluşturduk ve dizinin “tur” anahtarına dosya türünü ve “yol” anahtarına indirme yolunu base64 ile şifreleyerek ekledik. Şifrelememizin sebebi güvenlik.  Sonra dosya indirme işlemini yapacak indir.php sayfasına get yöntemiyle indir=yol,tur=tur diyerek yönlendirdik.

indir.php dosyası’nın kodları ise şöyle


<?  header("content-type:".base64_decode($_GET['tur'])."");
header("content-disposition: attachment; filename=".base64_decode($_GET['indir']));
readfile(base64_decode($_GET['indir']));
?>

1. Satır: indir.php dosyası kendi türünü get ile gelen tur verisini base64 şifrelemesini çözerek açıcağı dosya türü olarak gösteriyor.

2.Satır:  content-disposition: attachment; değeri ile dosya kendisini bir ek olarak gösteriyor ve adını da get ile gelen indir değerini base64 şifresini çözerek gösteriyor. Bu satır dosyanın tarayıcı tarafından derlenmek yerine indirilmesi gerektiğini söylüyor.

3.satır: Dosya kendisini tarayıcıya okutuyor.

Bu kadar. Oldukça basit bir işlem ve çok faydalı olabiliyor.

Sitelerimizi ziyaret eden kullanıcıya ziyareti ne kadar kolaylaştırırsak ziyaretçi o kadar memnun olacaktır.

Dosya tipi bilgilerini nerden bulacağız derseniz; buradan buyrun. Ayrıca Örnek Uygulama dosyasında bu bilgiler mevcut.  Teşekkürler @lous.

20 thoughts on “Php ile dosya indirmek (Güncellendi)

  • Sağolasın, gerçekten aklımdan geçiyordu böyle bir konunun araştırmasını yapmak, sen yazmışsın, iyi olmuş 🙂

  • Tam aradığım şeydi. winrar dosyaları için dosya türüne rar yazarsanız oluyor. Ben denedim ordan biliyorum.

  • Teşekkür ederim çalışman benim için yararlı oldu…
    Diğer MIME tipleri
    kaynak:http://tr.php.net/manual/en/function.mime-content-type.php

    $mime_types = array(

    ‘txt’ => ‘text/plain’,
    ‘htm’ => ‘text/html’,
    ‘html’ => ‘text/html’,
    ‘php’ => ‘text/html’,
    ‘css’ => ‘text/css’,
    ‘js’ => ‘application/javascript’,
    ‘json’ => ‘application/json’,
    ‘xml’ => ‘application/xml’,
    ‘swf’ => ‘application/x-shockwave-flash’,
    ‘flv’ => ‘video/x-flv’,

    // images
    ‘png’ => ‘image/png’,
    ‘jpe’ => ‘image/jpeg’,
    ‘jpeg’ => ‘image/jpeg’,
    ‘jpg’ => ‘image/jpeg’,
    ‘gif’ => ‘image/gif’,
    ‘bmp’ => ‘image/bmp’,
    ‘ico’ => ‘image/vnd.microsoft.icon’,
    ‘tiff’ => ‘image/tiff’,
    ‘tif’ => ‘image/tiff’,
    ‘svg’ => ‘image/svg+xml’,
    ‘svgz’ => ‘image/svg+xml’,

    // archives
    ‘zip’ => ‘application/zip’,
    ‘rar’ => ‘application/x-rar-compressed’,
    ‘exe’ => ‘application/x-msdownload’,
    ‘msi’ => ‘application/x-msdownload’,
    ‘cab’ => ‘application/vnd.ms-cab-compressed’,

    // audio/video
    ‘mp3’ => ‘audio/mpeg’,
    ‘qt’ => ‘video/quicktime’,
    ‘mov’ => ‘video/quicktime’,

    // adobe
    ‘pdf’ => ‘application/pdf’,
    ‘psd’ => ‘image/vnd.adobe.photoshop’,
    ‘ai’ => ‘application/postscript’,
    ‘eps’ => ‘application/postscript’,
    ‘ps’ => ‘application/postscript’,

    // ms office
    ‘doc’ => ‘application/msword’,
    ‘rtf’ => ‘application/rtf’,
    ‘xls’ => ‘application/vnd.ms-excel’,
    ‘ppt’ => ‘application/vnd.ms-powerpoint’,

    // open office
    ‘odt’ => ‘application/vnd.oasis.opendocument.text’,
    ‘ods’ => ‘application/vnd.oasis.opendocument.spreadsheet’,
    );

  • hocam çok güzek yanlız bende şöyle bir sorun var indirme yaparken dosyanın ismini değişebilirmiyiz ? diyelim asdfsfşlsdşlflsşdf.mp3 adlı bi parça olduğunda bunu indirmek istediğinde yeniden adlandırıcak işde murat.mp3 olucak şimdiden teşekkürler.

  • slm arkadaşlar bende bunun gibi bir script arıyordum bir kaç ek özellik eklense dahada güzel olur diyorum mesele 1 : resim rar zip swf bu dosyaları upload edebilecek
    2: edilen bu dosyaların resimse resmin 100 e 100 boyutlarında gösterimin olacak swf rar gibi görüntüsü olmayanın icon u olacak.
    3. alt klasör oluşturabilinecek bir script olsa tadından yenmez çünkü böyle bir script webte yok… çok araştırdım…

  • @murat ve @MURAT; bahsettiğiniz özellikler bu kodların amacının dışında kalıyor. Burada amaç, tıklandığında kendini tarayıcıda çalıştıran veya görüntüleyen dosya türlerinin ayrıca işleme gerek kalmadan indirilmesini sağlamak. Onun için bahsettiğiniz özellikleri bu kodların arasına eklemeye çalışmak pek mantıklı bi’iş değil.

  • teşekkür ederim. verdiğiniz kodu sitemde kullandım ancak iki sorun var:
    1. inen dosyanın boyutunu vermediği için downloadın ne kadar süreceği tahmin edilemiyor.
    2. dosyanın adını url+path+dosya_adı şekline dönüştürüyor. örneğin: http___depo.benimsitem.com_klasor_dosyaadi.rar

  • @yusuf geri bildirimin için teşekkür ederim. Müsait bir zamanda bu sorunları giderip yeni halini burada paylaşacağım inşallah. 🙂

  • Çok güzel bir şekilde çalıştı. Eline sağlık. O kadar sitede araştırdım doğru düzgün çalışmadı hiç birisi. Teşekkürler…

  • Bu kodu daha önce bende kullandım halada kullanıyoyorum. Hazırlayan arkadaşa teşekkürler.

    –Yusuf arkadaşın problemini bende yaşamıştım şöyle bir çözüm ürettim;

    1-) #KELİMELER TÜRKÇE KARAKTERE ÇEVRİLİYOR…
    function cevir($text) {
    $text = trim($text);
    $search = array(‘Ç’,’ç’,’Ğ’,’ğ’,’ı’,’İ’,’Ö’,’ö’,’Ş’,’ş’,’Ü’,’ü’);
    $replace = array(‘C’,’c’,’G’,’g’,’i’,’I’,’O’,’o’,’S’,’s’,’U’,’u’);
    $new_text = str_replace($search,$replace,$text);
    return $new_text;
    }
    2-) #Başlıktan Türkçe Karakterler çevriliyor.
    $ad = str_replace(” “, “_”, $sql[“baslik”]);
    $ad=cevir($ad);

    3-) #İndirilecek Dosya Çağrılıyor
    header(“content-type:”.base64_decode($_GET[‘tur’]).””);
    header(“content-disposition: attachment; filename=”.$ad.”.jpg”);
    readfile(base64_decode($_GET[‘indir’]));

    Şöyle açıklayayım.
    1. kısım normal bir Türkçe karakter çevirimi için kullanılan fonksiyon. Bunu kullanmamın sebebi, ben indirilecek resim’de (Kendi eklemiş olduğum Türkçe) başlığı kullanmak istedim. Bu yüzden Türkçe karakterleri temizlemek için kullandım.

    2. kısım “str_replace” komutu ile veritabanından aldığım başlığın içindeki boşlukları “_” ile değiştiriyor ve hemen altında ise cevir fonksiyonu ile başlığın son halini elde ediyoruz.

    3. kısımda ise artık aynı indirmeyi gerçekleştiriyoruz. filename kısmına elde ettiğimiz başlığı yazdım.

    Sonuç olarak dediğimiz gibi bir indirme sağlamış oluyoruz.

  • Hocam yazınız için öncelikle teşekkürler. Ama bende şöyle bir sorun var…
    index.php sorunsuz geliyo ama indir diyince indir.pxp 3. 5. satırda haat alıyorum. tur de ve readfile da. Hatayı çözemedim bir türlü. Yol falan mı belirtmem lazım

  • Herşey iyi güzelde..

    base64_encode şifreleyip, işleme alındığında da base64_decode ile çözmek çok mantık bir iş değil.. En basitinden şunu tarayıcınıza yapıştırın.. http://araclar.yedincisenol.com/indir/indir.php?indir=aW5kZXgucGhw

    index.php’yi indirebileceğinizi göreceksiniz.. Bir makale yazıyorsunuz, güvenliği göz ardı ediyorsunuz.. Ve yazdığınız makalelerden diğer kullanıcılar yararlanıyor! Potansiyel kurban yaratmak buna denir..

  • @burak, base64_encode sadece indirilecek dosya ismini handle edebilmek için kullanmış şenol.
    Referer url yada alternatif yöntemlerle dilediğin güvenlik önlemlerini alabilirsin. Php File Download konusunun mantığını ve basit kodlarını paylaşmak, sadece yol göstermek içindir. Kullanan kişiler kendi projelerinde aldığı önlemleri almakla mükelleftir elbette.

  • Merhabalar hocam. Daha önceleri araştırıp zor zekat bulduğum bi konuya değinmişsiniz. Ama araştırmalarım içerisinde bunu daha basit bir hale getirmenin yolunu da kısmi olarak da olsa buldum. Gayet basit bir sistem fakat ie6 ve öncesi sürümlerde çalışmadığını duymuştum. Kod şu :
    Bunu İndir!
    Umarım birilerinin işine yarar.

  • güvenlik açığı var kodların, Örnek: domain.com/indir.php?indir=include/connect.php&tur=php yazdığınızda dosyayı sorunsuz indirecektir.

    ÇÖZÜM :
    tür ve dizin adresini sabit yapıyoruz, göndermenize gerek yok.
    domain.com/indir.php?indir=resimadi.jpg

    header(“content-type:”.base64_decode(“png”).””);
    header(“content-disposition: attachment; filename=”.$_GET[‘indir’]);
    readfile(“upload/multimedya/”.$_GET[‘indir’]);

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir