18 Ekim 2008Php Dosya Download v2.0
Merhabalar çok uzun bir aradan sonra ilk defa post giriyorum bloğa. Bunun nedeni araya bayram tatili işlerin yoğunluğu da etken olmadı değil. Galiba biraz da ben boşverdim nedense. Dün oturup Pardus 2008 güncellemesi yaparken komodo ide diye tanıttığım program da yine daha önceden yazmış olduğum php ile dosya download betiğine biraz çeki düzen verdim ve böylelikle hem komodo ide yi biraz kullanmış oldum hem de dosya download sınıfımı biraz daha geliştirdim ekleme ve çıkarmalar yaparak daha kullanışlı bir hale getirdim.
İlk sürümdeki sınıfımız bir yapılandırıcı ile başlatılmaktaydı. Böyle olunca da her nesne için yeniden sınıf çağrılması ve başlatılması gerekiyordu ki bu da hem zaman kaybı hemde sıkıcı bir durum ortaya çıkarmaktaydı. Bu nedenle ilk versiyondaki yapılandırıcı olan __construct() metodumuzu bu yeni versiyon da kaldırmış bulunmaktayım.
Yeni sürümdeki metotlarımıza şöyle bir göz atalım..
setUrlAddress(): (yeni)
Erişim public. Bu metot ile download edeceğimiz dosyanın tam url adresini belirtiyoruz.
setDirectory():
Erişim public. Bu metot v1 den v2 ye aynen aktarıldı ve işlevi download edilecek olan dosyanın hangi dizin içine indirileceği belirtiliyor. Unutmadan söylemek gerekir ki dosyanın download edileceği dizinin izin hakları ayarlanmış olmalıdır.
setFileName(): (yeni)
Erişim public. Bu metot ile indirmek istediğimiz dosyaya yeniden isim vermek için kullanıyoruz. Ek parametreleri vardır bunlar;
true:
metoda true değeri girildiğinde random bir isim verecektir.
false:
metoda false değeri girildiğinde url deki dosya adını alacaktır
kullanici tanimli isim:
Eğer metoda kullanıcı kendisi isim verirse o şekilde kaydedecektir. Örn: setFileName(’yeni_dosya’) gibi.
getFileExtension(): (yeni)
Erişim private. Bu metoda sınıf içinden erişim yapılmaktadır. Böyle ayarlanmasının sebebi kullanıcının kafasının karışmaması içindir. Görevi ise indirilmek istenen dosyanın uzantısını döndürmektedir.
getData():
Erişim private. Bu metot ile download edilmek istenen dosyanın içeriği alınıyor ve kaydedilmek üzere depolanıyor. Bu metot v1 den v2 ye aynen aktarıldı.
saveData():
Erişim public. Bu metot ile içeriği okunup depolanan dosyanın belirtilmiş olan dizine kaydedilmesini sağlıyor. Yine bu metotda v1 den v2 ye aynen aktarıldı.
getMessage(): (yeni)
Erişim private. Bu metodumuz ise sınıf içinde tanımlanan getMsg adlı dizide toplanan output çıktılarını uygun ve düzenli bir şekilde kullanıcıya yansıtmak için kullanılan bildirim metodur.
Evet şöyle bir baktımda baya konuştum sanırım. Bahsettiğimiz sınıfın yeni sürümü aşağıdadır.
< ?php /* Php File Download v2.0 * Yusuf KOÇ ( Raiden ) * http://www.ysfkc.com * * Copyright 2008 Ysfkc.Com * Licensed under the GNU General Public License, version 2. * See the file http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt */ class fileDownload { private $fileUrl; private $file; private $dir; private $curl; private $content; private $fileName; private $fileExtension; private $getMsg = array(); public function setUrlAddress($url) { $this->fileUrl = $url; } public function setDirectory($name) { if (!is_writable($name) || !is_readable($name)) { $this->getMsg[] = 'Belirtmiş Olduğunuz Dizin Yazılabilir Değil'; $this->getMsg[] = 'Belirtmiş Olduğunuz Dizin Okunabilir Değil'; } else { $this->dir = $name; } } public function setFileName($name) { if (is_bool($name) && $name === false) { $this->fileName = preg_replace("/^(http:\/\/.*\/)?/i",'',$this->fileUrl); } else if (is_bool($name) && $name === true) { $this->fileName = md5(sha1(uniqid(mt_rand().microtime()))).'.'.$this->getFileExtension(); } else { $this->fileName = $name.'.'.$this->getFileExtension(); } } private function getFileExtension() { return preg_replace('/^(http:\/\/.*\.)?/i','',$this->fileUrl); } private function getData() { $this->curl = curl_init(); curl_setopt($this->curl,CURLOPT_URL, $this->fileUrl); curl_setopt($this->curl,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']); curl_setopt($this->curl,CURLOPT_RETURNTRANSFER,1); $this->content = curl_exec($this->curl); curl_close($this->curl); } public function saveData() { # Callback getData() $this->getData(); # Open new file $this->file = fopen($this->dir.'/'.$this->fileName,'w'); if (fwrite($this->file,$this->content)) { $this->getMsg[] = 'Dosya Kaydedildi.'; $this->getMsg[] = 'Dosya Yolu: <i>'.$this->dir.'/'.$this->fileName.'</i>'; return true; } else { $this->getMsg[] = 'Dosya Download Edilemedi'; return false; } } public function getMessage() { echo '<ul>'; foreach ($this->getMsg AS $value) { echo "\t<li>".$value."</li>\n"; } echo '</ul>'; } } ?>
Yeni sürüm php dosya download sınıfımız ile bir örnek yapalım.
< ?php /* Php File Download v2.0 * Yusuf KOÇ ( Raiden ) * http://www.ysfkc.com */ # Sınıfımızı Dahil Ediyoruz. # ------------------------------- include_once('ysfkc.file.php'); # Sınıfımızı Başlatıyoruz. # ----------------------------- $file = new fileDownload; # Download Etmek İstediğimiz Dosyayının URL Adresini Giriyoruz. # ------------------------------------------------------------------- $file->setUrlAddress('http://www.ysfkc.com/dosyalar/ajax.tar.gz'); # Download Edilecek Dizini Belirtiyoruz. # ---------------------------------------- $file->setDirectory('test'); # Dosyaya Random İsim Verdiyoruz True Parametresini Girerek. # False Direk ajax.tar.gz olarak alacaktır. # İsterseniz de $file->setFileName('yeni_isim') ile kendiniz de isim verebilirsiniz. $file->setFileName(true); # Son Olarak Dosya Kaydetme İşlemini Başlatıyoruz. # ---------------------------------------------------------------- if ($file->saveData()) { # Download İşlemi Başarılı Oldu İse Bildirim Mesajını Alıyoruz. # ---------------------------------------------------------------- $file->getMessage(); } else { # Download İşlemi Başarılı Olmadıysa Hata Bildirimini Yapıyoruz # ---------------------------------------------------------------- $file->getMessage(); } ?>
Evet görüldüğü gibi kullanımı oldukça basit bu sınıf uzak sunucudaki bir dosyayı kendi sunucumuza veya local bilgisayarımıza kaydetmek için gayet kullanışlı.
Örneğimizi indirmek için tıklayınız

Tebrik ederim. Güzel bir çalışma
ben şu class olayını hala anlamış değilim yani anlamadığm nokta neden class kulanayım ?
/*
tekrar yazmana sevindim :)ihmal etme bloğunu
uzun süredir gözükmüyosun hala bitmedimi yoğunluk
*/
Merhaba serkan.
Class kullanmak her zaman faydalı çünkü kod karmaşıklığından kurtarır. Düzenli kodlamaya imkan sağlar. Her yeni proje için oturup aynı kodları yazmaktan kurtulursun. Müdahele edilebilirliği kolaylaştırır. Gibi nedenler daha sıralanabilir.
İşlerim yoğun nedense bir de bu ara biraz soğudum ondan pek görünmüyorum…
$file->setFileName(true); yerine $file->setFileName($dosyaadi);
yaptıgımda hata veriyor ne yapabilirim?
@nurettin
aldığınız hatayı buraya yazabilirseniz eğer daha çabuk çözüme ulaşmış oluruz.
kusura bakma degişkende problem varmış
Ben Curl kullanarak çoğu siteye erişip işlem yapabiliyorum fakat erişmeye çalıştığım bir sayfa jsp ile yapılmış ve POST etmeye çalıştığım formun action kısmında j_security_check yazıyor ve bir türlü login olamıyorum, Java’da form güvenliğini sağlayan bir metod bu anladığım kadarıyla, daha önce siz curl ile bu tarz bir sayfaya bağlanmaya çalıştınız mı çünkü çoğu forumda sizin curl ile yaptığınız uygulamalar ve örneklere rastladım bu konuda bir bilginiz varsa, paylaşırsanız sevinirim.
Kolay gelsin.
@Enes
bunu yapabilmek için öncelike form sayfasını ziyaret edip j_security_check bölümündeki oluşturulan değeri aldıktan sonra post etmeniz gerekmekte. aşağıdaki linkte bir örnek yapmıştım bunla ilgili size yol gösterebilir…
http://forum.ceviz.net/366451-post10.html
Teşekkür ederim paylaşım için..
sevgili admin baska bir sunucudan kendi sunucuma cektigim resmi resize yapmak istiyorum ama surekli hata aliyorum kodlarim alttaki gibi yardimci olursaniz sevinirim
<?
$resimdosyasi = file_get_contents($matches[1]);
$ek = “h.jpg”;
$img_dir = ‘./news/’;
$kod =rand(); //create random number
$r_adi = $kod.$ek;
$dos = fopen($img_dir . $r_adi, “w”);
fwrite($dos, $resimdosyasi);
fclose($dos);
$resim = $r_adi;
$resim = trim($resim);
echo “Resim : “;
}
}
?>
@Atesch
o kodlar yerine şuan ki sınıfı kullanabilirsiniz ayrıca yine bloğum da bulunana image sınıfını da kullanarak kaydettiğiniz resimleri kolayca resize edebilirsiniz