KategorilerPHP

[PHP] Dosya Yolunu Vermeden Dosya Paylaşımı

Merhaba, bu yazımda size dosyalarınızın kaynak yolunu vermeden dosyaları indirme yöntemini göstereceğim. Bu şekilde yapılan indirmelerde dosyayı indirme yolu olarak sizin PHP dosyanızın yolu verilecektir. Basit ama çok etkili bir yöntemdir ve bu sayede müzik / film / resim ve daha aklıma bile gelmeyen bir sürü dosya paylaşım veya satış sitelerinde online olarak indirmelerde dosyalarınızı korur, sadece o kişinin o dosyayı indirebilmesini sağlarsınız.

Bu günkü yazımda hem en sade halini, hem de Session ile güvenlikli bir indirmenin yolunu anlayacağız. Session sistemimizde kullanıcının bizim dosyayı indirmesini istediğimiz kullanıcı olup olmadığı ve  belirli bir indirme limiti aşıp aşmadığını test edeceğiz. İlk olarak en basit yolu gösteriyoruz. Burada değerini değiştirmeniz gereken iki değişken vardır. Zaten kodların açıklamalarında neden ve nasıl olduğu gayet net bir şekilde açıklanmıştır.

Sade Versiyon (Kodlar)

[php]
<?php
$DLPath = "Downloads/Secure/";
$DLFile = "File.zip";
header(‘Content-type: application/zip’);
header(‘Content-Disposition: attachment; filename="’. $DLFile .’"’);
readfile($DLPath. $DLFile .);
?>
[/php]

Sade Versiyon (Açıklamalar)

Kodların açıklamalarını aşağıda vereceğim.  Bu sayede daha iyi ve anlaşılır olacaklar.

$DLPath Bu kod ile dosyamızın gerçek yolunu belirtiyoruz. Burada dikkat etmeniz gereken şey dosyamızın adı ve uzantısı bu yolda geçmeyecek. Örnek kullanım: “Downloads/Secure/”

$DLFile Dosyamızın adı ve uzantısı. Dosya kullanıcının bilgisayarına inerken de bu isimle inecektir. (Fakat dosya yolu kullanıcıya gözükmeyecektir) Örnek Kullanım: “File.zip” Dosyanın Gerçek Yolu: “Downloads/Secure/File.zip”

header(‘Content-type: application/zip’); İndirilecek olan dosyanın formatı seçilir. Daha fazla format için tıklayın.

header(‘Content-Disposition: attachment; filename=”‘. $DLFile .'”‘); Sayfamızın HTML değil de bir dosya olduğunu belirtir.

readfile($DLPath. $DLFile .); Dosyamızı indirmemizi sağlayan fonksiyondur. Burada $DLPath ile $DLFile’ı birleştiriyoruz. Bu sayede readfile fonksiyonuna girdiğimiz değer: Downloads/Secure/File.zip olmaktadır.

Bu sayede dosyamızı yolunu başka kimseyle paylaşmadan indirmiş olduk. Şimdi gelelim daha gelişmişine. Aslında burada yapmamız gereken tek şey altta vereceğim kodları buradaki kodların üstüne eklemek olacak çünkü kodlarımızı ona göre yazacağım.

Gelişmiş Versiyon (Kodlar)

Burada alacağınız tüm kodları Sade Versiyonun hemen üstüne ekleyerek kullanabilirsiniz. Bu sayede sisteminizden dosya indirmek isteyenlerin belirli bir Session’a sahip olması ve indirme limitini aşmamış olması gerekmektedir. Bu sefer açıklamaları kodların içinde vereceğim. Çünkü bu sefer sadece if else deyimleriyle işlem yapacağım. Burada önemli olan ve değerini değiştirmeniz gereken sadece bir adet değişken var. O da indirme limitimizdir 🙂

[php]
<?php
//Sessionları başlatıyoruz. Eğer bu kod olmaz ise hiçbir session değerimiz çalışmaz.
session_start();
//İndirme limitimizi buradan belirliyoruz. İstediğiniz basamakta sayı girebilirsiniz. Yalnız değer sadece tamsayı olmalı !
$LIMIT = 5;
//Eğer kişinin dosyayı indirme yetkisini belirleyen session değeri boş ise hata yazdırıp exit(); fonksiyonu ile işlemi durduruyoruz.
if (empty($_SESSION[‘YETKI’])){
echo "Bu dosyayı indirmek için gerekli yetkiye sahip değilsiniz !";
exit();
}
//Eğer indirme adedimizi sayan session değeri boş ise onu 0’a eşitliyoruz ki sistemimiz işlemleri yaparken sorun yaşamasın.
if (empty($_SESSION[‘INDIRME’])){
$_SESSION[‘INDIRME’] = 0;
}
//İndirme adedimizi sayan session değeri belirlediğimiz limitten büyük veya o limiti aşıyor ise hata yazdırıp işlemi durduruyoruz.
if ($_SESSION[‘INDIRME’] >= $LIMIT){
echo "İndirme limitinizi aştınız. Bu dosyayı indiremezsiniz !";
exit();
}
//Tüm kontrollerden başarıyla geçildiyse indirme adedimizi bir arttırıyoruz ki kişinin dosyayı kaç kere indirdiğini sistem anlasın.
$_SESSION[‘INDIRME’] ++;
?>
[/php]

Kişilere Yetki Vermek

Kişilerin dosya indirmesini sağlamak için onlara yetki vermelisiniz. Bunun için aşağıdaki kodu session_start(); kodundan sonraki bir yere eklemelisiniz. Bu sistemimizde Yetki sessionunun içindeki değerin ne olduğuna bakmadık, sadece boş ise hata verdik (ki session açılmadıysa o her zaman boş olacaktır.)

[php]
<?php
$_SESSION[‘YETKI’] = "kullanıcının yetkisi bulunmaktadır";
?>
[/php]

Derli Toplu Kod

Evet, her şey bu kadardı, şimdi size kodların tümünü derli toplu bir vaziyette vereyim ki rahat bir şekilde kullanabilesiniz. Bu kodumuzda tüm kullanıcılara dosya indirebilmesi için gereken yetkiyi de otomatik olarak vereceğiz (yani üstteki kod aşağıdaki kodların arasında bulunmaktadır.).

[php]</pre>
<?php
//Sessionları başlatıyoruz. Eğer bu kod olmaz ise hiçbir session değerimiz çalışmaz.
session_start();
//Kullanıcıya yetkisini veriyoruz.
$_SESSION[‘YETKI’] = "kullanıcının yetkisi bulunmaktadır";
//İndirme limitimizi buradan belirliyoruz. İstediğiniz basamakta sayı girebilirsiniz. Yalnız değer sadece tamsayı olmalı !
$LIMIT = 5;
//Eğer kişinin dosyayı indirme yetkisini belirleyen session değeri boş ise hata yazdırıp exit(); fonksiyonu ile işlemi durduruyoruz.
if (empty($_SESSION[‘YETKI’])){
echo "Bu dosyayı indirmek için gerekli yetkiye sahip değilsiniz !";
exit();
}
//Eğer indirme adedimizi sayan session değeri boş ise onu 0’a eşitliyoruz ki sistemimiz işlemleri yaparken sorun yaşamasın.
if (empty($_SESSION[‘INDIRME’])){
$_SESSION[‘INDIRME’] = 0;
}
//İndirme adedimizi sayan session değeri belirlediğimiz limitten büyük veya o limiti aşıyor ise hata yazdırıp işlemi durduruyoruz.
if ($_SESSION[‘INDIRME’] >= $LIMIT){
echo "İndirme limitinizi aştınız. Bu dosyayı indiremezsiniz !";
exit();
}
//Tüm kontrollerden başarıyla geçildiyse indirme adedimizi bir arttırıyoruz ki kişinin dosyayı kaç kere indirdiğini sistem anlasın.
$_SESSION[‘INDIRME’] ++;
?>
<?php
$DLPath = "Downloads/Secure/";
$DLFile = "File.zip";
header(‘Content-type: application/zip’);
header(‘Content-Disposition: attachment; filename="’. $DLFile .’"’);
readfile($DLPath. $DLFile );
?>
<pre>
[/php]

Dosyalar Nasıl Gözükür?

İndirme Sayfası - Büyütmek için tıklayın

Önemli Duyuru

Bazı sunucular benim deyimimle titiz olduklarından hata verebilirler. Bunun olmaması için sayfanın en üstüne (< ?php tagından hemen sonra) ob_start(); kodunu sayfanın en altına (?> tagının hemen üstüne) ob_end_flush(); komutunu ekleyin. Ve ek olarak indirme işleminiz olan sayfada önceden hiçbir yazı vb. şeyin olmaması gerekmekte html kodları da dahil. Yani kaynak kodlarınız tamamiyle boş olmalıdır.

Ve Yazının Sonu

Evet, tüm kodlar bu kadardı. Kodların tamamını test etmedim ama çalışacağına eminim. Yine de bir sorun çıkarsa bana alttan yorum yolu ile veya iletişim bölümünden bildirirseniz hemen düzeltirim.

Umarım yararlı olmuştur. Eğer beğendiyseniz bu yazıyı üstteki butonlardan paylaşabilir veya bize Destek Ver‘ebilirsiniz. Her türlü soru ve sorununuzda yorum atmayı unutmayın, sağlıcakla kalın …

“[PHP] Dosya Yolunu Vermeden Dosya Paylaşımı” üzerine 17 yorum

  1. bu kodları wordpress sitesinde nereye eklememiz gerekmektedir ? Birde yetk olayını anlayamadım . Bu kod ile ziyaretçiler dosyaları indiremeyecekmi veya yetki verirsek üye olduktan sonra mı dosyayı indirebilecekler ?

    1. Bu sistemin WordPress ile alakası bulunmamaktadır. Fakat dilerseniz kendiniz bunu ekleyebilirsiniz.
      Üyelik konusunda da o sadece bir örnekti, yani yine kendi sisteminize entegre etmeniz gerekmektedir.

  2. Merhabalar, öncelikle ellerinize sağlık bilgiler çok faydalı, ancak aşağıdaki kodları pdf bir dosya için kullandım. Localde çalışmasına rağmen sunucuda çalışmadı. Dosyayı download etmiyor html gibi ekrana basmaya çalışıyor. Localde çalışan sunucuda bunu niye yapar anlayamadım. Fikrinizi almak istedim kolay gelsin…

    1. Merhaba,

      Bazı sunucularda Header hataları alabilirsiniz. O hataları genelde bazı titiz sunucular verir. Bir çok müşterimin başına da gelmiştir o. Unuttuğumdan yazıya eklememişim kusura bakmayın. Hatayı düzeltmek için sayfanın en üstüne (< ?php tagından hemen sonra) ob_start(); kodunu sayfanın en altına (?> tagının hemen üstüne) ob_end_flush(); komutunu ekleyin. Genelde Header işlemlerinde böyle sonuçlar alabilirsiniz. Ve ek olarak indirme işleminiz olan sayfada önceden hiçbir yazı vb. şeyin olmaması gerekmekte html kodları da dahil. Yani kaynak kodlarınız tamamiyle boş olmalıdır.

        1. Merhaba. Rica ederim. Yukarıda dediğim gibi bir hata bulunmakta. ob kodlarını eklediğiniz halde hata devam ediyor ise kaynak kodlarını bana http://support.evrimaltay.net/ adresinden gönderin. Oradan size yardımcı olayım. Verdiğiniz linkte hata şöyle ki müşterilerimde de böyle olmuştu daha önceden, Header bilgisi daha önceden gönderildi, değiştiremezsiniz diyor. Biz de bu dosya indirme işleminde header bilgisini değiştirmeye çalıştığımızdan sunucu bu değişikliği yapamıyor ve pdf dosyayı olduğu gibi ekrana basıyor. Sunucunuzdaki bir hatadan kaynaklanmıyor bu dediğim gibi sadece, titiz bir sunucunuz var 🙂

  3. Kodları deniyordum ama sanırım bir sorun oldu sorun şu ?
    ana sayfadan tc kimlik numarası giriliyor

    bu kodlar karşılıyor ve istenen sinavgiris klasörü içindeki pdf dosyası insin. kod çalıştırıldığında bilgisayara bir tckimlik.pdf dosyası iniyor ancak içi boş 😀 ve acrobat ta çalışmıyor… sorun nedendir

    1. Bunun nedeni şu sistem yeni bir pdf dosyası oluşturmaz, varolan bir dosyayı indirmenizi sağlar. Dosya yolu bulunamazsa sistem istediğiniz isimde .pdf uzantılı bir dosya oluşturur.

    1. Merhaba, sade versiyonun kodlarını indir.php dosyasına keydettiğinizi varsayarsak, indir.php dosyası sizin indirme adresiniz olacaktır. Kişi indir.php dosyasını ziyaret eder etmez indirme başlayacaktır.

  4. mrb.
    Benim wix ile hazırlamış olduğum bir sitem var ve bu siteden program download ediliyor.
    Sizin yazılımınız tam benim istediğim şekilde é download edildiğinde indirme adresi gözükmesin istiyorum” ancak bu kodları ben wix’de nasıl ekleyeceğim.
    HTML Kod bölümü var onun içine’mi paste yapacağız. bu konuda’da yardımcı olurmusunuz.

    1. Merhaba, sanırım wix bir hazır web-sitesi oluşturma platformu. Platform ile ilgili pek bilgim olmamakla beraber, büyük olasılıkla php kodları eklemenize/düzenlemenize izin vermeyecektir. Herhangi bir ücretli/ücretsiz host kullanarak dosyanızı uzakta barındırıp; php kodlarınızı da orada çalıştırabilirsiniz. İyi çalışmalar.

  5. Bir de sunucuda dosya listview içinde listeleme lazım anlatır mısınız?
    Not:youtube gibi video sitesi yapıyorum
    1-)session ile Üyelik sistemini yaptım
    2-)dediğiniz yöntem ile dowland yaptım
    3-)dosya upload ile upload etmeyi yaptım
    Bir tek youtube gibi videoları listeleme kaldı.

  6. Merhaba, çalışma için teşekkürler. Ben kendi ftp’imdeki değilde google driver üzerindeki veya başka yerdeki bir dosyayı link olarak vermek istiyorum. O zaman kodalarda nasıl bir güncelleme yapmalıyız?

    1. Merhaba,
      Eğer dosyanın içeriğini php ile görüntülenmeniz engellenmedi ise; (Google Drive bazı durumlarda engelleyebiliyor.)
      file_get_contents($link); ile dosyayı çekip readfile ile yerini değiştirmeniz; sorununuzu çözecektir.

Bir cevap yazın

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