ASP.NET'te Upload İşlemi
ASP.NET web tarayıcısından web sunucusuna dosya yüklemeyi (upload) kolay bir şekilde sağlar. Klasik ASP de Upload işlemi nispeten zor bir işti. Üçüncü parti bileşenlere ihtiyaç duyuyorduk veya oturup, biraz zorlayıp kendi Upload bileşenimizi yazmamız gerekiyordu. ASP.NET de Upload işlemleri iki satırlık kodla yapılıyor artık. ASP.NET geliştiricileri, web programcılarının takıldığı yerleri bularak bunlara kolay ve kullanışlı çözümler sunmuşlar. Buna örnek olarak Upload'ı verebiliriz.
ASP.NET ile basit bir Upload işlemini nasıl yapabilirim ?
Fazla lafa gerek yok hemen başlayalım. İlk olarak yüklenecek dosya yolunun yazılacağı bir giriş kutusuna (<input type="file" id="yukleme" runat="server" />), bir butona ve bir iki satır koda ihtiyacımız var:
<%@ Page Language="C#" %>
<script runat="server">
void Dugme1_Click(object Source, EventArgs e)
{
string strDosyaAdi; // değişken tanımlıyoruz.
// işe girişmeden bir sorguyapıyoruz. dosya var mı yok mu?
if (yuk_dosya.PostedFile != null) {
// başta tanımladığımız değişkene aşağıdaki formdan gelen bilgiyi atıyoruz.
strDosyaAdi = yuk_dosya.PostedFile.FileName;
// formdan gelen dosya bilgilerden yalnız dosya ismini ayrıştırıyoruz.
strDosyaAdi = strDosyaAdi.Substring(strDosyaAdi.LastIndexOf("\")+1);
try {
// PostedFile.SaveAs özelliği ile dosyayı bilgisayarımız da belirlediğimiz yere kaydediyoruz.
yuk_dosya.PostedFile.SaveAs("c:\yukle\"+strDosyaAdi);
// Bir bilgi mesajı veriyoruz.
Msj.InnerHtml = "Dosya Yüklendi.: c:\yukle\" + strDosyaAdi +"<br>";
}
catch (Exception err) {
// hata durumu için mesaj
Msj.InnerHtml = "Dosya Yüklemede hata c:\yukle\" + strDosyaAdi +"<br>";
}
}
}
</script>
<html>
<head>
</head>
<body>
<b> ASP.NET ile Upload İşlemleri</b>
<form id="frmyukle" enctype="multipart/form-data" runat="server">
Yükleyeceğiniz Dosyayı seçiniz.:
<input id="yuk_dosya" type="file" runat="server">
<br>
<span id=Msj runat="server" />
<asp:button id="dugme1" text="Yukle!!" OnClick="Dugme1_Click" runat="server" />
</form>
</body>
</html>
Örnek kod dosyayı, C:Yukle dizini altına kaydetmeye çalışacaktır. Çalıştırmadan önce böyle bir dizin oluşturunuz veya kodda gerekli değişikliği yapınız.
Kodu biraz inceleyelim. Değişkenleri tanımlıyoruz, dosya var-yok kontrolünü yapıyoruz. Tanımladığımız değişkene (strDosyaAdi) formdan gelen dosya adını atıyoruz. Pek dosya adı denmez çünkü formdan gelen değer genelde dosyanın yolunu içerir: Örneğin c:\documentsaspelge.txt. Ancak bize burda lazım olan kısım belge.txt yani dosyanın sadece ismidir. Bunun için de bir küçük kırpma işlemi yapıyoruz. PostedFile nesnesinin SaveAs metodu ile dosyayı bilgisayarımıza kaydediyoruz. Burada biz bilgisayarımızda c:yukle adında bir klasör açtık ve yüklenecek dosyalara bu yolu gösterdik. Sonuçta iş bitmiştir mesajını veriyoruz. Hatalar için de bir mesaj veriyoruz tabii. Bu mesajları burada Msj.InnerHtml ile kullanıcıya yansıtıyoruz.
İşin HTML tarafına gelelim: Bir form oluşturduk. Burada önemli noktalardan bir tanesi şu ki form içinde enctype="multipart/form-data" özelliğini yazdık. Tabi ASP.NET teknolojisinin tabularından runat="server" ve id=yukle yi unutmayalım. Sonra bir <input> girişi oluşturduk ve type="file" özelliğini yazmayı unutmadık. Mesajlarımız için bir <span> oluşturduk. Burada span'a bir id (id=Msj) atadığımıza ve runat=server eklediğimize dikkat edin. Son olarak da bir buton oluşturduk, oluşturduğumuz bu butonun OnClick olayına Dugme1_Click işlevini bağladık.
Dosya yüklememiz için bize en büyük katkıyı yapan PostedFile nesnesidir. PostedFile nesnesinin SaveAs metodunu kullanarak yaptık tüm işimizi. Ayrıca PostedFile
nesnesinin FileName özelliğini kullanarak da formdan gelen dosyamızın ismini öğrendik. PostedFile'ın marifetleri daha bitmedi, aşağıda değineceğiz.
Kullanıcının yüklediği dosyanın bazı özelliklerini nasıl elde ederim ?
Sunucumuza yüklenen dosyanın özelliklerini öğrenebiliriz. PostedFile nesnesi bize önemli bilgiler verir. Örneğin dosya adı, dosya tipi ve dosya boyutu gibi. Biraz önceki örnekte dosya adının nasıl elde edildiğini gördük (strDosyaAdi = yuk_dosya.PostedFile.FileName). Şimdi de yüklenen dosyanın tipi ve boyutunu elde etmeyi öğreneceğiz.
<%@ Page Language="C#" %>
<script runat="server">
void Dugme1_Click(object Source, EventArgs e)
{
string strDosyaAdi; // değişkenleri tanımlıyoruz.
string strDosyaTipi;
int intDosyaBoyutu;
// işe girişmeden bir sorgu yapıyoruz. dosya var mı yok mu?
if (yuk_dosya.PostedFile != null) {
// başta tanımladığımız değişkenlere dosyanın özelliklerini atıyoruz.
strDosyaAdi = yuk_dosya.PostedFile.FileName; // dosya adı
strDosyaTipi = yuk_dosya.PostedFile.ContentType; // dosya tipi
intDosyaBoyutu = yuk_dosya.PostedFile.ContentLength; //dosya boyutu (byte)
// formdan gelen dosya bilgilerden yalnız dosya ismini ayrıştırıyoruz.
strDosyaAdi = strDosyaAdi.Substring(strDosyaAdi.LastIndexOf("\")+1);
try {
// PostedFile.SaveAs özelliği ile dosyayı bilgisayarımız da belirlediğimiz yere kaydediyoruz.
yuk_dosya.PostedFile.SaveAs("c:\yukle\"+strDosyaAdi);
// Bir mesaj veriyoruz, ve dosya özelliklerini de ekliyoruz.
Msj.InnerHtml = "Dosya Yüklendi.: c:\yukle\" + strDosyaAdi +
"<br>" + strDosyaTipi + "<br>"+ intDosyaBoyutu +"byte";
}
catch (Exception err) {
Msj.InnerHtml = "Dosya Yüklemede hata c:\yukle\" + strDosyaAdi + "<br>"
+ strDosyaTipi + "<br>"+ intDosyaBoyutu +"<br>";
}
}
}
</script>
<html>
<head></head>
<body>
<b> ASP.NET ile Dosya Yükleme İşlemleri</b>
<form id="frmyukle" enctype="multipart/form-data" runat="server">
Yükleyeceğiniz Dosyayı seçiniz.:
<input id="yuk_dosya" type="file" runat="server">
<br>
<span id=Msj runat="server" />
<br>
<asp:button id="dugme1" text="Yukle!!" OnClick="Dugme1_Click" runat="server" />
</form>
</body>
</html>
Yukarıdaki örnekle aynı olan kısımları es geçerek, yeni eklediğimiz kısmın açıklmasını yapalım. Yeni özellikler için değişken atadık. Kullanıcının yüklediği dosyanın tipinin öğrenmek için (resim dosyasımı(jpg,gif), yazı dosyasımı(txt)) strDosyaTipi = yuk_dosya.PostedFile.ContentType; kodunu yazdık. Kullanıcını gönderdiği dosyanın boyutunu (byte tipinde) intDosyaBoyutu = yuk_dosya.PostedFile.ContentLength; kodu ile öğreniyoruz. Basit değil mi? Aldığımız bu değerleri sonra bilgi mesajı olarak ekranda gösteriyoruz. Tüm bu bilgileri PostedFile nesnesinden aldığımıza dikkat edin.
Birden Fazla Dosya Yükleme İşlemini Nasıl Yaparım?
Tamam, tek dosya yükleme işlemi yaptık da ben sitemde birden fazla yükleme işlemi yapmak istiyorum? Şimdi de bu sorunun cevabına bakalım. Bu iş için HttpFileCollection sınıfını ve HttpRequest.Files özelliğini kullanacağız.
<%@ Page Language="C#" %>
<SCRIPT LANGUAGE="C#" RUNAT="SERVER">
void yukle_tiklandiginda(Object sender, EventArgs e) {
Msj.InnerHtml = yukleMesaj(); // mesajlar için bir metod ürettik.
}
string yukleMesaj() //metodu tüm döngü boyunca uyguladık.
{
string strDosyaAdi; //değişkenleri atadık.
string strMesaj = "";
HttpFileCollection HttpFiles = Request.Files;
for (int i = 0; i < HttpFiles.Count; i ++){ //Döngümüzü kurduk.
HttpPostedFile _HttpPosted = HttpFiles[i];
if ( _HttpPosted.ContentLength > 0 ) { //Dosya Sorgulamasını yaptık (boş dolu)
strDosyaAdi = _HttpPosted.FileName.Substring(_HttpPosted.FileName.LastIndexOf("\")+1);
// Dosya ismi için kırpma işlemi yaptık.
try {
_HttpPosted.SaveAs("c:\yukle\"+strDosyaAdi); //Dosyaları bilgisayarımıza kaydetttik.
strMesaj+= "Yüklendi : c:\yukle\"+strDosyaAdi+"<br>"; //Bilgi mesajımızı verdik.
}
catch (Exception err)
{
strMesaj+= "Yüklemede hata var. "+strDosyaAdi+": "+err.ToString()+"<br>"; //Hata mesajı
}
}
}
return strMesaj;
}
</SCRIPT>
<HTML>
<BODY>
<FORM RUNAT="SERVER" ENCTYPE="multipart/form-data">
<TABLE>
<TR><TD><H3>Çoklu Upload İşlemleri</H3></TD></TR>
<TR><TD><B>Upload Edeceğiniz Birinci Dosyayı seçiniz.</B></TD></TR>
<TR><TD><INPUT Type="File" Runat="Server" Id="dosya1" /></TD></TR>
<TR><TD><B>Upload Edeceğiniz İkinci Dosyayı seçiniz.</B></TD></TR>
<TR><TD><INPUT Type="File" Runat="Server" Id="dosya2" /></TD></TR>
<TR><TD><B>Upload Edeceğiniz Üçüncü Dosyayı seçiniz.</B></TD></TR>
<TR><TD><INPUT Type="File" Runat="Server" Id="dosya3" /></TD></TR>
<TR><TD>
<ASP:Button Id="yukle" OnClick="yukle_tiklandiginda"
Text="Hepsini Yükle" Runat="Server" />
</TD></TR>
</TABLE>
<BR>
<SPAN Id="Msj" Runat="server" />
<BR>
</FORM>
</BODY>
</HTML>
Kodu inceleyelim. İşin HTML kısmında fazla bir farklılık yok. Dikkat ettiyseniz bir önceki örneklerde bir adet dosya yüklemek için bir <input> unsuru kullanıyorduk, şimdi üç dosya yüklemek için tabii ki üç <input> unsuru kullanacağız.
Gelelim kod kısmına, yukleMesaj() metodu döngüdeki herbir yükleme işlemi için bize bir mesaj üretiyor ve biz de bu mesajı sayfaya sonuç olarak yazdırmak için kullanıyoruz.
Kod kısmında önemli bir payı HttpFileCollection sınıfı ve HttpPostedFile nesnesi alıyor. Diğer taraftan formdan gelen tüm dosyaların bilgisayar kaydedilmesi için bir döngü kurduk. Bu işlemlerde düğmemize tıklama ile tetiklendi. Yüklenecek her dosya için döngü alttaki işlemleri yani yükleme işlemlerinin gerçekleştirdi. Bu kısımdaki işlemlerin açıklamasını yukarıdaki örneklerde değinmiştik.
Upload Edeceğimiz dosya boyutunu nasıl ayarlayacağız?
Bu bir soru veya bir hata sorusu da olabilir. Eğer siz 4 mb dan fazla boyutlu bir dosya upload etmeye kalkarsanız muhtemelen bir hata mesajı alacaksınızdır. Bunun nedeni kişisel suncunuzda veya web sunucunuzda sınırın (öntanımlı değerinin) 4 mb (4096) olarak belirlenmesinden kaynaklanır. Şimdi bu değeri istediğimiz kadar arttırmayı göreceğiz. Nasıl mı? Makinamızın yapılandırma dosyasındaki maxRequestLength değerini değiştireceğiz.
Nasıl yapacağız bu işi? WINDOWSMicrosoft.NETFrameworkv1.0.3705CONFIGmachine.config dosyasındaki, <system.web> kısmından :
<httpRuntime
executionTimeout="90"
maxRequestLength="4096"
useFullyQualifiedRedirectUrl="false"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100"
/>
bölümünü buluyoruz. Buradaki maxRequestLength="4096" kısmını isteğe bağlı olarak değiştirdik mi işlem tamam. (Ben mesela bu değeri 7096 yaptım, ve örnekte bir upload yaptım 6,581 kb lık bir dosya idi ve herhangi bir sorun yaşamadım.)
Sonuç:
Sonuçta gördüğünüz gibi ASP.NET'te upload işlemi zor bir işlem değil. Unutmamamız gereken noktaları sıralarsak:
- Form etiketi içinde ENCTYPE="multipart/form-data" kullandık
- Input etiketini deklare ederken Type="file" yazdık.
- Upload işlemi için HttpPostedFile, HtmlInputFile sınıflarını ve özelliklerini kullandık.
