/* iframe dosya yükleme betiği sürüm 0.5 Tarih: 02 Kasım 2008 Ben: Mustafa Atik Detay: http://www.cookingthecode.com/ http://cookingthecode.com/a17_Sayfa-Yenilemeden-Dosya-Yuklemek-(iframe) Herhangi bir lisansa sahip değil, nasıl isterseniz öyle kullanın. */ function iframeUploadFile(vn,url) { this.uploadLimit=3; // yüklenebilecek maksimum dosya sayısı. this.uploadCount=0; // yüklenmiş dosya sayısı this.flist; // yüklenmiş dosyaların gösterileceği liste. Eğer yoksa, kod tarafından oluşturuluyor. this.varName=vn; // Bu sınıftan alınan nesne örneğini tutan değişkenin adı. Sadece nesne oluşturulurken bir kez belirtilmesi yeter. this.loadingImg='loading.gif'; // dosya yüklenirken, yükleme işleminin halen devam ettiğini ifade edecek animasyon if(url) this.url=url; // gönderilen dosyaları sunucu tarafndan karşılayacak dosyanın yolu. this.tmpContainer=document.documentElement; // kod ile oluşturulan iframe ve diğer geçici nesneleri barındıracak elementi belirtir. } var _protUF=iframeUploadFile.prototype; _protUF.send=function(browseBox,url) { /* browseBox=sunucuya yüklenecek dosyanın seçildiği kutu, file input url =dosyayı alacak adres örn: http://sunucu.com/dosyaal.php */ if(browseBox.value=='') return false; if(this.uploadLimit<=this.uploadCount) {alert('En fazla '+this.uploadLimit+' adet dosya yükleyebilirsiniz.'); return false;} if(url) this.url=url; var sesID=Math.floor(Math.random()*9999999); // bu yükleme işlemi için benzersiz bir numara üretiliyor var fr=document.createElement('form'); // dosyanın gönderimini yapacak form oluşturluyor. var newBrowseBox=browseBox.cloneNode(true); // browseBox elementi, yeni oluşturulan forma eklenecek. Çünkü klonlanır ise, ie tarayıcısı bu kutunun değerini sıfırlıyor. Ben de seçim yapılmış kutuyu forma ekledim, kopyasını ise eskisinin yerine. var ifrm=document.createElement('iframe'); // üzerinden dosyanın gönderileceği frame oluşturluyor. //bu frame, 'gözat' kutusunu barındıran katmana görünmez olarak ekleniyor. //iframe oluşturulduktan hemen sonra bu işlem yapılıyor ki, iframe'in kök nesnesi kullanılabilsin. ie6 nedeniyle yazmak gerkeli this.tmpContainer.appendChild(ifrm); // contnetWindow ie için, contentDocument firefox, opera ve dipeğleri için if(ifrm.contentWindow) ifrm.cnt=ifrm.contentWindow; else ifrm.cnt=ifrm.contentDocument; ifrm.cnt.name='hifrm'+sesID; ifrm.id='hifrm'+sesID; setAttributes(ifrm,[['width',0],['height',0],['border',0],['style','display:none;']]); setAttributes(browseBox,[['id',null],['class',null]]); setAttributes(fr,[['id','f'+ifrm.id],['target',ifrm.cnt.name],['action',this.url],['method','post'],['encoding','multipart/form-data'],['enctype','multipart/form-data'],['style','display:none']]); // yeni seçim kutusu, eskisi ile yer değiştiriyor. browseBox.parentNode.insertBefore(newBrowseBox,browseBox); fr.appendChild(browseBox); this.tmpContainer.appendChild(fr); if(this.fList==null) this.createFileList(newBrowseBox.parentNode); this.insetToList(browseBox.value,ifrm.cnt.name); fr.submit(); this.checkUploading(ifrm.cnt.name); } _protUF.createFileList=function(parent) // parent= yüklenmiş dosya listesini barındıracak katman { var flist=getByClass('ufList',parent); if(flist.length>0) flist=flist[0]; else { flist=document.createElement('ul'); flist.setAttribute('class','ufList'); } this.fList=flist; parent.appendChild(this.fList); } _protUF.insetToList=function(fileName,ifrmID) { return true; } _protUF.checkUploading=function(ifrmID) { var vn=this.varName; var ifrm=getById(ifrmID); if(!ifrm) return false; try { if(ifrm.contentWindow) var doc=ifrm.contentWindow.document; else var doc=ifrm.cnt; var resp=doc.getElementById('uploadMsg').innerHTML; // dosya işlemi başarılı ise if(resp==1) { this.changeForUpload(ifrmID,doc.getElementById('newName').innerHTML); } else { this.uploadCount--; this.changeForError(ifrmID,resp); } // iframe ile yapılacak bir şey kalamdı, siliniyor. this.removeTempElements(ifrmID); } catch(e) { // henüz dosya yüklenmemiş, dolayısıyla yanıt gelmemişse, bu metodu biraz zaman sonra tekrar çalıştır. setTimeout(vn+'.checkUploading(\''+ifrmID+'\')',1800); return false; } } _protUF.changeForError=function(ifrmID,erorMsg) { var vn=this.varName; var fLi=getByClass(ifrmID,this.fList)[0]; var errorTag=getByTag('span',fLi)[0]; var rmvLink=getByTag('a',fLi)[0]; rmvLink.innerHTML='Kaldır'; rmvLink.onclick=function(){eval(vn+'.deleteErrorLi("'+ifrmID+'");')}; errorTag.innerHTML=erorMsg; getByTag('img',fLi)[0].parentNode.removeChild(getByTag('img',fLi)[0]); fLi.setAttribute('class',fLi.className+' '+'error'); } _protUF.changeForUpload=function(ifrmID,newName) { var vn=this.varName; var fLi=getByClass(ifrmID,this.fList)[0]; var rmvLink=getByTag('a',fLi)[0]; var hiddenName=document.createElement('input'); setAttributes(hiddenName,[['type','hidden'],['name','newNmae'],['value',newName]]); rmvLink.innerHTML='Sil'; rmvLink.onclick=function(){eval(vn+'.deleteFile("'+ifrmID+'");')}; getByTag('img',fLi)[0].parentNode.removeChild(getByTag('img',fLi)[0]); fLi.setAttribute('class',ifrmID+' '+'uploaded'); fLi.appendChild(hiddenName); } _protUF.deleteFile=function(ifrmID) { if(!confirm('Dosyayı silmek istiyor musunuz?')) return false; var vn=this.varName; var fLi=getByClass(ifrmID,this.fList)[0]; var xhr=new simpleAjax() // httprequest nesnesi xhr.send( this.url, 'command=delete&file='+getByTag('input',fLi)[0].value, {'onSuccess':function(rps){ if(rps=='1') { eval(vn+'.uploadCount--'); fLi.parentNode.removeChild(fLi); } else alert('HATA: '+rps); } } ); return false; } _protUF.deleteErrorLi=function(ifrmID) { var fLi=getByClass(ifrmID,this.fList)[0]; return fLi.parentNode.removeChild(fLi); } _protUF.abort=function(ifrmID) { var fLi=getByClass(ifrmID,this.fList)[0]; this.removeTempElements(ifrmID); this.uploadCount--; return fLi.parentNode.removeChild(fLi); } _protUF.removeTempElements=function(ifrmID) { this.tmpContainer.removeChild(getById(ifrmID)); this.tmpContainer.removeChild(getById('f'+ifrmID)); }