Merhabalar. Bu yazımda elimden geldiğince hem class yapısı hem de php ile uzak sunucudaki bir dosyayı kendi local veya sunucumuza kaydetmeyi göreceğiz.
Öncelikle sınıfımızın bir planını yapalım.
Merhabalar. Bu yazımda elimden geldiğincehem class yapısı hem de php ile uzak sunucudaki bir dosyayı kendi localveya sunucumuza kaydetmeyi göreceğiz.
Öncelikle sınıfımızın bir planını yapalım.
Sınıfımıza indirilecek dosyanın tam url adresini belirteceğiz.
Dosyanın indirileceği dizinin belirtilmesi
İndirilmek istenen dosyanın yeni bir isim, random bir isim veya direk dosya adı ile kaydedilmesi
Dosya uzantısının alınması
İndirilecek dosya içeriğinin okunup depolanması
İçeriği okunan dosyanın kaydedilmesi
Kullanıcıya bildirim yapmak için bildirim hazırlanması
Şimdi yukarıda belirttiğimiz işlemleri yapmaya koyulalım..
/* 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: ’.$this->dir.‘/’.$this->fileName.‘’;
return true;
}
else
{
$this->getMsg[] = ‘Dosya Download Edilemedi’;
return false;
}
}
public function getMessage()
{
echo ‘’;
foreach ($this->getMsg AS $value)
{
echo “\t- ”.$value.“
\n“;
}
echo ‘
’;
}
}
?>
Şimdi biraz daha ayrıntıya girelim.
setUrlAddress() metodunda kullanıcıdan dosyanın tam url adresini alıyoruz ve bunu sınıfımızın içinde kullanılmak üzere tanımlanmış $fileUrl ye daha sonra kullanmak için depoluyoruz.
setDirectory() ile kullanıcıdan alınan dizin adının yazılabilir ve okunabilir olup olmadığı kontrol ediliyor dizin yazılamaz ve okunamaz ise $getMsg dizimize gerekli bildirim mesajları ekleniyor. Eğer yazılabilir ve okunabilir ise sınıf içinde tanımladığımız $dir değişkenin de depolanıyor.
setFileName() sınıfımızın üç adet parametre alan fonksiyonu. Bu metot yukarıda da belirttiğimiz gibi üç adet parametre almaktadır bunlar true false ve kullanıcı tanımlı isim. Eğer parametre olarak true verilirse metot random bir isim üretip $fileName değişkenine eşitleyecektir. False değeri verilirse dosya adında değişiklik yapmadan $fileName’e eşitleyecektir. İkisi de girilmediği taktirde kullanıcının belirttiği dosya ismi $fileName’e eşitlenecektir.
getFileNameExtension() metodumuz ile de download edilmek istenen dosyanın uzantısını döndürüyoruz.
getData() ile de download edilecek dosyanın içeriği okunup $content içine depolanıyor. Bu metotda cURL kullandım eğer cURL yüklü değil ise doğal olarak sınıf çalışmayacaktır. Ayrıca cURL kullanmamın bir diğer nedeni ise user-agent bilgisinin gönderilmesi bunun da nedeni bazı siteler user-agent kontrolü yapmaktalar bu sebeple bunu da bir nebze aşmış oluyoruz.
saveData() metodu sınıfımızın start fonksiyonu oluyor öncelikle getData() çağrılarak download edilecek dosyanın içeriğinin alınması sağlanıyor. Ardından $file ile kullanıcıdan aldığımız bilgilere göre kaydedilecek dizin ve dosya yazma modunda açılıyor ve fwrite() ile içeriği alınan dosya kaydediliyor. Sonuc doğru ise uygun bildirim mesajları ayarlanıp fonksiyondan true olarak dönüyoruz eğer bir hata oluştu ise false dönüyoruz.
getMessage() sınıfımızın son metodu. Bu metod ile $getMsg ye depolanmış bildirim mesajlarını foreach ile uygun bir formatta bildirim yapıyoruz.
Bir örnekle tamamlayalım
# 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();
}
?>
Yazım hatalarım için özür dilerim. Uygulamayı buradan indirebilirsiniz.
Yusuf Koç