Web sitesi üzerinden resim yüklemek isteyen arkadaşlar için basit bir uygulama yaptım. Uygulama için demo, indirme ve kod kısmı aşağıdadır.
Demo (Tasarım için hakan'a teşekkürler.)
İndir
PHP:
<?php
##################################################################################
#
# Dosya : islem.php
# Lisans : http://www.gnu.org/copyleft/gpl.html
# <http://www.onur.org>
# Tarih : 10/08/2009
#
##################################################################################
class imajport
{
public static $klasor = _KLASOR_;
public static $yukleme_boyutu = _KB_;
public static $url;
public $mime = array('jpg' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif'); #Kabul gören resim formatlari
public $resim_yolu = lisanssız;
public $curl_sonuc = lisanssız;
public $bilgi;
/*
** Ön tanimli kontrol ve islemleri yapar.
** @access lisanssız
** @param lisanssız
*/
public function __construct()
{
# klasor kontrolleri
if (!is_dir(self::$klasor) && !is_writable(self::$klasor))
throw new Exception(2);
# sunucuda curl, gd ve file_get_contents var mi?
if (!extension_loaded('curl') && function_exists('file_get_contents') && extension_loaded('gd'))
throw new Exception(3);
}
/*
** Yükleme Fonksiyonu
** @access public
** @param boolean
*/
public function yukle($_DOSYA)
{
$dosya = &$_DOSYA;
$islem = true;
if (is_uploaded_file($dosya['tmp_name']))
{
# dosya ismini temizle
$dosya['name'] = $this->_temizle($dosya['name']);
# yükleme hatasi ve gelen veri türüne bak
if ($dosya['error'] !== 0 && !is_array($dosya))
$islem = false;
# resim dosyasini oku ve uzantisini al
if (!$this->_kontrol($dosya['tmp_name'], $dosya['name']))
$islem = false;
# mime tipini öntanimlilarin içinde süz
if (!in_array($dosya['type'], $this->mime))
$islem = false;
$dosya_boyutu = (int)($dosya['size'] / 1024) / 1024; // KB -> MB
# dosya boyutunu kontrol et
if ( round($dosya_boyutu, 2) > self::$yukleme_boyutu)
$islem = false;
# $islem degiskeninin bool olup olmadigina bak ve degiskenin durumuna göre islemi baslat
if (is_bool($islem) && $islem === true)
{
# resim yolunu tanimla
$this->resim_yolu = sprintf('%s/%s', self::$klasor, $dosya['name']);
# dosyayi yükle ve sonucu degiskene at
$yukle = (move_uploaded_file($dosya['tmp_name'], $this->resim_yolu)) ? true : false;
# yükleme sonucunu kontrol et
if ((bool)$yukle === false || file_exists($this->resim_yolu) === false)
throw new Exception(7);
}
else
{
throw new Exception(4);
}
}
}
/*
** Karakter Temizleme Fonksiyonu
** @access public
** @param string
*/
public function _temizle($dosya)
{
$_temiz = trim($dosya);
$_temiz = strtolower($_temiz);
# preg_replace ile desene göre düzenle
$_temiz = preg_replace('[^0-9A-Za-z\.]', "_", $_temiz);
return $_temiz;
}
/*
** Uzanti ve Resim Dogrulama Fonksiyonu
** @access public
** @param boolean
*/
public function _kontrol($dosya, $dosya_adi)
{
#operatöre göre ARRAY olarak döndür
$parcala = explode('.', $dosya_adi);
#benzer dizeleri sil
$_uzanti = array_unique($parcala);
#son parçayi al
$_uzanti = end($_uzanti);
#resimi dogrula ve uzantiyi kontrol et
if (imagecreatefromstring(file_get_contents($dosya)) === false ||
array_key_exists($_uzanti, $this->mime) === false)
return false;
else
return true;
}
/*
** Dosyayi resim.im'a curl ile yükleme fonksiyonu
** @access public
** @param string
*/
public function imajport_tasi()
{
#site adresinin dogrulugunu kontrol et
$desen = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/';
if (preg_match($desen, $this->url) === false)
throw new Exception(5);
#cURL oturumunu baslat
$oturum = curl_init();
#API adresini degistirmeyiniz.
curl_setopt($oturum, CURLOPT_URL, 'http://api.resim.im/api?q=yukle');
curl_setopt($oturum, CURLOPT_POST, true);
curl_setopt($oturum, CURLOPT_TIMEOUT, 60);
curl_setopt($oturum, CURLOPT_HEADER, false);
#$_FILES
$_alan = array('site' => $this->resim_yolu,
'dosya' => "@{$this->resim_yolu}");
curl_setopt($oturum, CURLOPT_POSTFIELDS, $_alan);
curl_setopt($oturum, CURLOPT_RETURNTRANSFER, true);
#yükleme sonucunu degiskene ata
$this->curl_sonuc = curl_exec($oturum);
if ($this->curl_sonuc === false) {
throw new Exception(6);
}
#xml olarak dönen datayi oku
$xml = simplexml_load_string($this->curl_sonuc);
$this->bilgi = (int)$xml->sonuc;
#oturumu kapat
curl_close($oturum);
if(unlink($this->resim_yolu) === false)
error_log('Geçici klasör içinden resim silinemedi.', 0);
return $this->bilgi;
}
/*
** Sinif sonlaniyor
** @access lisanssız
** @param lisanssız
*/
public function __destruct()
{
#$dosya = $_FILES degiskenini yoket
unset($dosya);
}
}
# Ön tanimli degerler
define('_KLASOR_', 'tmp'); # Gecici klasor adi, chmod 775 vermeyi unutmayiniz.
define('_KB_', '2048'); # 1 MB maksimum degerdir. Degeri kilobayt olarak girmelisiniz. 1000 KB azaltabilir ama yükseltmeniz halinde hata alirsiniz.
error_reporting(0); # 0 olmasi tavsiye edilir, cURL safe_mode sebebiyle open_basedir hatasi verebilir.
if ($_FILES)
{
ob_start();
try
{
$a = new imajport;
$a->yukle($_FILES['dosya']);
$a->imajport_tasi();
echo $a->bilgi;
}
catch (exception $e)
{
echo $e->getMessage();
}
$veri = ob_get_contents();
ob_end_flush();
echo '<script type="text/javascript">
window.top.bitir("'.intval($veri).'");
</script>';
}
?>