AJAX İle Dosya Göndermek



AJAX’in artık bir çok
farklı alanda kullanılabileceğini eburhan‘ın AJAX Ne Gibi Durumlarda
Kullanılmalı? başlıklı yazısında gördük. Gelin bunlara bir de AJAX
ile sitemize dosya göndermeyi ekleyelim. Bunun nasıl yapıldığını
kendi yazmış olduğum AJAX Göndermeç isimli betik ile anlatmaya
çalışacağım. Konu hakkında biraz daha ipucu vermek gerekirse AJAX
ile dosya göndermenin mümkün olup olmadığını göreceğiz.

AJAX ile dosya göndermenin mantığı
Yukarıda AJAX ile dosya göndermenin mümkün olup olmadığını
göreceğimizi söylemiştim. Şimdi de cevabını veriyorum; malesef
hayır, yani AJAX ile dosya gönderemiyoruz. Sebebini açıklamak
gerekirse, bildiğiniz gibi normal form bilgilerini GET ve POST
metodlarıyla gönderiyoruz. Form ile dosya göndereceğimiz zaman da
POST metodunu kullanırız ve karşı tarafta da gönderilen dosyanın
bilgilerini $_FILES[’…’] değişkeni ile alabiliriz.

AJAX ile dosyayı göndermeye çalıştığımızda ise form normal bir
şekilde gönderiliyor gibi görünmektedir fakat alıcı dosyada $_FILES[’…’]
değişkeni bir sonuç vermez ve hata ile karşılaşırız. Çünkü kullanmış
olduğumuz tarayıcılar malesef güvenlik nedeniyle (özel ayarlar
yapılmadığı müddetçe) XmlHttpRequest nesnesi üzerinden dosya
göndermeye müsade etmiyor

Peki bir çözümü var mıdır ve varsa nedir? Kısmen de olsa bir çözüm
var diyebiliriz; gizli bir iframe kullanmak. Sitemize göndereceğimiz
dosyayı seçtikten sonra formumuzu bu iframe’e göndeririz. Ardından
AJAX ile dizin listemizi güncelleriz. Kullanıcı sanki tek bir işlem
oluyormuş gibi görür yani dosyanın AJAX ile gönderildiğini düşünür.
Oysa ki dosyayı gönderen AJAX değil bildiğimiz HTML formu ve iframe‘dir.
İnanıyorum ki AJAX Göndermeç‘i açıkladıktan sonra konuyu daha iyi
anlayabilirsiniz.

AJAX Göndermeç betiğimiz iki klasör ve 4 adet dosyadan oluşuyor.Ajax Göndermeç dosyaları
 

Dosyaları tanıtmaya
başlamadan önce şunu söylemeliyim ki sanırım artık dosyaların içini
olduğu gibi yazmama gerek yok. Zaten makalenin sonunda
indirebileceğiniz bağlantılar bulunuyor. Yazımda sadece kodlarda
dikkatinizi çekmek istediğim noktaları belirteceğim.

KLASÖRLER
dosyalar: Sitemizde göndermiş olduğumuz dosyaları
barındırdığımız klasör. İsteğinize göre değiştirebilirsiniz. Önemli
olan klasörün izninin yani CHMOD ayarının 777 yani yazılabilir
olması gerektiği.

eyceks: Bu betiği hazırlarken sitemiz yazarı Erhan Burhan’ın
eyceks isimli kütüphanesinin son versiyonu olan 1.3′ten faydalandım.
eyceks klasöründe eyceks kütüphanesi (eyceks.js) ile yüklenme
esnasında gösterilecek olan resim dosyası (loading.gif) bulunuyor.

DOSYALAR
index.php: Betiğimizin temel dosyası ve anasayfasıdır. Dosya
gönderme formu, javascript fonksiyonlarımız ve css stil
seçicilerimiz bu dosyada bulunur. Dosyanın dikkatinizi çekmek
istediğim kısmı javascript fonksiyonlarıdır.

PLAIN TEXTJAVASCRIPT:
function dosyaSil(silinecekDosya) {
if( confirm('Dosya Silinsin mi?') ) {
var sc="yap=sil&dosya="+silinecekDosya;
JXP(1, "dizin_alani", "cevap.php", sc);
}
}

function yenile() {
var sc="yap=yenile";
JXP(1, "dizin_alani", "cevap.php", sc);
}

function dosyaGonder(){
document.dosyaFormu.submit();
var sc="yap=gonder";
JXP(1, "dizin_alani", "cevap.php", sc);
document.dosyaFormu.reset();
}
Farkettiyseniz artık AJAX nesnesi XmlHttpRequest'i çağırmak için bir
ton kod ile uğraşmıyoruz. Hazır kütüphane kullanmanın faydalarından
birisi de budur. Tabi konunun mantığını anlamadan da hazır kütüphane
kullanmanızı kesinlikle tavsiye etmiyorum.

Javascript fonksiyonlarına dönecek olursak:
dosyaSil(dosya) fonksiyonu cevap.php dosyasına silinmesini
istediğimiz dosyanın ismini gönderir. Gelen sonuç dizin_alani
id'sine sahip alanda görüntülenir. Şunu da belirtmekte fayda var,
gelen sonuç yine dizindeki dosyaları listeleme işlemidir.
yenile() fonksiyonu dosya listesini yenilemenizi sağlayan
fonksiyondur. Tüm sayfa yerine sadece AJAX sayesinde dosya listesini
yenileyebiliyoruz. Yenilerken yapılan işlem cevap.php dosyasından
dizini listelemesini istemekten başka bir şey değildir
dosyaGonder() fonksiyonu önce formumuzu yani gözat diyerek seçmiş
olduğunuz dosyayı iframe'e gönderir, ardından cevap.php dosyasından
dosya listesini yenilemesini ister ve son olarak formu sıfırlar.

Not: Dosyayı iframe'e göndermesini buradan değil, formun
tanım bilgisinden target="pencere" yani pencere isimli iframe
diyerek belirtiyoruz.

dizin.php: Bu dosyanın tek işlevi kendi içinde barındırdığı
ve bizim düzenlediğimiz klasor değişkeni ile belirtilen dizindeki
dosyaları listelemek. Bu dosyayı include('dizin.php'); diyerek
anasayfada(index.php) ve cevap.php dosyasında çağırıyoruz.

PLAIN TEXTPHP:
<?php
$klasor = "dosyalar/"; //Burayi duzenleyin

$sonuc='<table style="font-size:12px;">';
if ($dizin = opendir($klasor)) {
while ($dosya = readdir($dizin)) {
if ($dosya!='.' AND $dosya!='..')
{
$sonuc.= '<tr style="background-color:#EEEEEE;height:10px;border:1px
dashed Gray;">';
$sonuc.= '<td style="padding: 5px;" width="450" align="left">';
$sonuc.= '<a href="dosyalar/'. $dosya. '">'. $dosya. '</a></td>'; //burasi
onemli
$sonuc.= '<td style="padding: 5px;" width="50" align="center">';
$sonuc.= '[<a href="javascript:dosyaSil(\''. $dosya.
'\');">sil</a>]</td>';
$sonuc.= '</tr>';
}
}
closedir($dizin);
}
$sonuc.='</table>';
echo $sonuc;
?>

cevap.php: Bu dosya AJAX ile bilgileri gönderdiğimiz
dosyadır. İki adet işlevi bulunmakta:

1) Eğer silme işlemi seçilmişse, dosya değişkeni ile gelen dosyayı
siliyor.
2) Dizindeki dosyaları dizin.php dosyasını çağırarak listeliyor.

Burada dikkatinizi çekmek istediğim konu sleep(2) fonksiyonu. Bu
fonksiyon içine girilmiş olan değer boyunca(saniye) betiği bekletir.
Bekletmek istedim çünkü aynı zamanda bir yandan iframe'e gönderilmiş
bir dosya bulunmakta ve bu dosya siteye yüklenmekte. Diyelim ki
dosyamız biraz büyük. O halde cevap.php fonksiyonundan cevap
geldiğinde dosya hala yüklenmediği için yine eski dizini
görebiliriz. Bu yüzden de dosyanın gönderilmediğini sanarız. Oysa ki
dosya hala gönderilmektedir. Aslında buna bir tedbir olarak
anasayfaya (index.php) dizin listesini yenilemek için Yenile
bağlantısı koydum ama yine de bu sleep fonksiyonu da bir önlem
olabilir.

PLAIN TEXTPHP:
<?php

$klasor = "dosyalar/"; //Burayi duzenleyin

if ($_POST['yap'] =="sil")
{
$dosyasil = $klasor.$_POST['dosya'];
$silindi=unlink($dosyasil);
}

sleep(2);

include('dizin.php');
?>

islem.php: Bu dosya iframe içinde çağırdığımız dosyadır ve
form ile gönderilen dosyayı yine islem.php dosyasında bulunan klasor
değişkeni ile belirttiğimiz klasöre gönderir.

PLAIN TEXTPHP:
<?php

$klasor = "dosyalar/"; //Burayi duzenleyin
$giden = $klasor . basename($_FILES['dosya']['name']);
move_uploaded_file($_FILES['dosya']['tmp_name'], $giden)

?>

Ve mutlu son
Bu uygulama geliştirildiği takdirde basit işlemler için güzel bir
dosya yöneticisi haline dönüşebilir. Hatta dosya gönderme işlemi
php'nin ftp fonksiyonlarıyla yapılırsa tıpkı bir ftp programı gibi
kullanılabilen bir betik bile olabilir

Umarım AJAX Göndermeç'ten memnun kalırsınız. Maksadım mantığını
anlatmak olduğu için basit bir örnek sundum size. Belki ilerki
seviyelerde sadece kullanmanız için güzel örnekler verebiliriz.

Yeni yorum gönder

Bu alanın içeriği gizli tutulacak ve açıkta gösterilmeyecektir.
  • Web sayfası ve e-posta adresleri otomatik olarak bağlantıya çevrilir.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • Satır ve paragraflar otomatik olarak bölünürler.

Biçimleme seçenekleri hakkında daha fazla bilgi

CAPTCHA
Aşağıdaki resimde yer alan karakterleri kutucuğa doğru olarak yazınız
Image CAPTCHA
Enter the characters shown in the image.

Anket

Web sitesinde hangisi daha önemlidir:

Son Konular

2012-04-10 00:53 - Chrome Pili daha çabuk bitiriyor
2012-03-22 19:47 - Geliştirdiğin kodları satmak ister misin
2012-02-12 23:21 - SMF forumu vbulletin foruma aktarmak
2011-12-14 21:50 - Motorlu araçlar otomobil vergisi sorgulama
2011-12-14 21:47 - Sorgulamalar
2011-12-11 14:33 - Ben az önce ne arayacaktım
2011-09-10 22:51 - DSLR Fotograf Makinası sınıflandırması
2011-09-09 17:33 - ‘Crop Factor’ Nedir, hakkında bilgi
2011-09-09 17:30 - Fotograf Rehberi
2011-08-20 21:30 - Samsung LEDTV'lerde .SRF ve XFS süprizi
2011-08-19 00:45 - 2011 yılının web tasarım trendleri
2011-04-09 20:18 - Alan adları gerçek isim sahiplerine verilecek!
2011-01-13 01:43 - SEO İçin Dikkat Edilmesi Gereken Hususlar
2011-01-13 01:42 - Meta tag SEO Optimization
2011-01-13 01:41 - Google Adsense Hakkında Detaylı Bilgi
2011-01-13 01:40 - Soru Ve Cevaplar ile Google Adsense
2011-01-13 01:39 - Arama motoru Google ve Pagerank
2011-01-13 01:38 - Seo Sözlüğü
2011-01-13 01:37 - Google Arama Özellikleri
2011-01-13 01:36 - Adsense Reklam Yerleşimi
2011-01-13 01:35 - Robots.txt Dosyası Kullanım Robotları Yölendirme Kontrol
2011-01-13 01:34 - Sitenizin Google ve Web deki Yeri
2011-01-13 01:33 - Arama Motoru Bilgi ve İpuçları
2011-01-13 01:31 - Arama Motorları Teknikleri
2011-01-13 01:29 - Google Pagerank Detaylı Anlatım
2011-01-13 01:27 - Sitenize Ziyaretçiler En Çok Hangi Kelimeler İle Gelmiş
2011-01-13 01:25 - Pagerank Nedir?
2011-01-13 01:19 - Fireworks Shadow and Glow
2011-01-13 01:18 - Fireworks Sharpen
2011-01-13 01:16 - Fireworks Other
2011-01-13 01:13 - Fireworks Blur
2011-01-13 01:09 - Fireworks Bevel and Emboss
2011-01-13 01:05 - Fireworks Adjust Color
2011-01-13 01:03 - Fireworks Save as Style
2011-01-13 00:58 - Fireworks Text Menüsü
2011-01-13 00:54 - Fireworks Select Menüsü
2011-01-13 00:54 - Fireworks Modify Menüsü
2011-01-13 00:51 - Fireworks View Menüsü
2011-01-13 00:18 - Fireworks Edit Menüsü
2011-01-13 00:16 - Fireworks File Menüsü
2011-01-13 00:05 - İnternet - Web Tarayıcılar (Browser)
2011-01-13 00:04 - İnternet - Web Server Yazılımları
2011-01-13 00:03 - İnternet ve Web İlişkisi
2011-01-13 00:02 - İnternette Kullanılan Protokoller
2011-01-13 00:01 - İnternet - World Wide Web (WWW) Nedir?
2011-01-13 00:00 - İnternet - URL nedir?
2011-01-12 23:43 - İnternet Backorder Nedir?
2011-01-12 23:34 - İnternet - Virüs Nedir?
2011-01-12 23:32 - İnternet Paypal nedir? Nasıl Kullanılır?
2011-01-12 23:31 - İnternet - DNS Nedir?