Makale Özeti

Makale içinde ASP.net'in fileupload kontrolünün kullanımı, metodları, güvenlik önlemi sayılabilecek dosya boyutu sınırı ve ufak bir araç olarak da SHA1 algoritması var

Makale

Merhaba .net severler. Bu makalemde size fileupload kontrolünden ve onun yardımıyla dosya göndermekten bahsedeceğim...

Fileupload kontrolünü toolboxdan sürükleyerek formunuza taşıyabilirsiniz... Fileupload kontrolümüzün diğer kontrollerden farklı olarak birkaç özellik,fonksyon veya altyordamı var. (Kusura bakmayın renklendirme yapamadım)

.filebytes Gönderilen dosyanın içeriğini byte cinsinden getirir
.filecontent Gönderilen dosyayı stream cinsinden alır
.filename dosyam.uzanti şeklinde dosya adını döndürür
.postedfile HttpPostedFile classını çağırır
.saveas c:\klasor\dosyaadi.uzanti şeklinde verdiğimizde o konuma kaydeder

 

Şimdi biraz da sık sık kullanmamızı gerektiren postedfile sınıfına ve alt yordamlarına değinelim

.contentlength Dosyanın boyutunu byte olarak döndürür(örnekte dosya boyutunu daha şık göstermenize yardımcı olabilecek bir fonksiyon mevcut)
.contenttype Dosyanın türünü döndürür jpeg için image/pjpeg olabilmektedir örneğin.
.filename Dosyanın kullanıcı bilgisayarındaki yolunu gösterir. e:\klasorum\dosya.jpg gibi
.inputstream Dosyanın içeriğini stream olarak gönderir. Üstteki Fileupload kontrolünün filecontentiyle aynıdır
.saveas Dosyayı belirtilen yere kaydetmeye yarar. Fileupload kontrolünün saveasiyle aynıdır

 

Bazı durumlarda dosya boyutuna limit koymamız gerekebilir bunu ister if pfDosya.postedfile.contentlenght>aa then hata şeklinde yapabiliriz istersek web.configden ayarlayabiliriz... Ben şu an kullandığım projede ikisini de kullanıyorum... 1. si limiti aşıp aşmadığını kontrol etmek için 2. si de kötü amaçlı kişileri engellemek için.. Örneğin çok güçlü bağlantıya sahip olan biri siteye 1 gb lık dosya gönderip sunucunun internet trafiğini yavaşlatmak isteyebilir.. Buna karşı en iyi çözüm yolu web.configtir.

web.config ayarı

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

<system.web>

    <httpRuntime executionTimeout="3600" maxRequestLength="51200" />

</system.web>

</configuration>

executionTimeout="3600" bu 1 saate denk gelir.. Sunucu 1 saatten sonra veri alımını iptal eder

maxRequestLength bu da KB cinsinden veri boyutudur. Bunu aştığında veri alımı iptal eder

 

Ama unutmayın ki bu ayarlar dosya olsun olmasın tüm istekler için geçerlidir. O yüzden burayı ayarlarken dikkatli olmalısınız

 

Fileupload kontrolünü anlattık. Şimdi işimize yarayabilecek bir ipucu paylaşmak istiyorum sizinle.

Aynı dosya adına sahip dosyaların gönderilme durumunun olduğu sayfalarda dosyaların adını o anı şifreleyerek kaydediyorum. Yani timer'ımızın gönderdiği değeri sha1 algoritmasıyla şifreleyip o şekilde kaydediyorum... Örnek dosyamızda bunu göreceksiniz. Umarım hoşunuza gider

 

Bahadır Arslan'ın yoğun ısrarları üzerine örnek dosyanın kodlarını da buraya koyuroum:)

 

Bir adet fileupload controlü ve birkaç adet label koydum

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:FileUpload ID="flDosya" runat="server" /><asp:Button ID="btnGonder" runat="server"
Text="Button" />
<br />
</div>
<asp:PlaceHolder ID="phsonuc" runat="server" Visible="false">
<table>
<tr>
<td>
<b>Eski dosya adı</b></td>
<td>
<asp:Label ID="lbleskidosyaadi" runat="server" Text="Label"></asp:Label></td>
</tr>

<tr>
<td>
<b>Dosya uzantısı</b></td>
<td>
<asp:Label ID="lbldosyauzanti" runat="server" Text="Label"></asp:Label></td>
</tr>
<tr>
<td>
<b>Yeni dosya adı</b></td>
<td>
<asp:Label ID="lblyenidosyaadi" runat="server" Text="Label"></asp:Label></td>
</tr>
<tr>
<td>
<b>K. bilgisayarındaki yolu</b></td>
<td>
<asp:Label ID="lblkbilgpath" runat="server" Text="Label"></asp:Label></td>
</tr>
<tr>
<td>
<b>Boyut</b></td>
<td>
<asp:Label ID="lblboyut" runat="server" Text="Label"></asp:Label></td>
</tr>
<tr>
<td>
<b>Dosya Türü</b></td>
<td>
<asp:Label ID="lbltur" runat="server" Text="Label"></asp:Label></td>
</tr>
<tr>
<td>
<b>Sha1Sum</b></td>
<td>
<asp:Label ID="lblSha1sum" runat="server" Text="Label"></asp:Label></td>
</tr>
</table>
</asp:PlaceHolder>
</form>
</body>
</html>

 

Şimdi codebehind'ımıza geçelim ve btnGonder kontrolümüzün click eventini kodlayalım:)

Imports System.io
Partial Class _Default
Inherits System.Web.UI.Page
Public Function boyutcevir(ByVal lngByte As Long) As String
Dim sonuc As String
If lngByte < 1024 Then
sonuc = lngByte & " byte"
ElseIf (lngByte < 1024 ^ 2) Then
sonuc = FormatNumber(lngByte / 1024, 2) & " KB"
ElseIf (lngByte < 1024 ^ 3) Then
sonuc = FormatNumber(lngByte / (1024 ^ 2), 2) & " MB"
ElseIf (lngByte < 1024 ^ 4) Then
sonuc = FormatNumber(lngByte / (1024 ^ 3), 2) & " GB" 'Belki işimize yarayabilir
ElseIf (lngByte < 1024 ^ 5) Then
sonuc = FormatNumber(lngByte / (1024 ^ 4), 2) & " TB" 'Çok zor, belki ilerleyen zamanlarda işimize yarayabilir
End If
Return sonuc
End Function
Protected Sub btnGonder_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGonder.Click
If Not flDosya.PostedFile.FileName = "" Then
phsonuc.Visible = True
Dim pf As HttpPostedFile = flDosya.PostedFile
Dim yenidosyaadi As String = clssha1.metinsha(Timer)
lbleskidosyaadi.Text = flDosya.FileName
lbldosyauzanti.Text = Path.GetExtension(flDosya.FileName)
lblyenidosyaadi.Text = yenidosyaadi & lbldosyauzanti.Text 'niye string builder kullanmadın dediğinizi duyar gibiyim
lblboyut.Text = boyutcevir(pf.ContentLength)
lblkbilgpath.Text = pf.FileName
lbltur.Text = pf.ContentType
lblSha1sum.Text = clssha1.streamsha(pf.InputStream)
flDosya.SaveAs(Server.MapPath(lblyenidosyaadi.Text)) 'gönderilen dosyanın üzerine yazılmasını engellemek ve dosyayı farklı adla akydetmek yerine ben timer'ımızın sha1 değerini alıyorum. Aynı timer değerini almanın imkansız ve timer ile aynı sha1 koduna sahip bir stringin bulunmasının da neredeyse imkansız olması yüzünden bence çok iyi bir yol
Else
phsonuc.Visible = False
End If
End Sub

End Class

 

 

Bir de yardımcı olabileceğini düşündüğüm SHA1 classımızı verelim

Imports Microsoft.VisualBasic
Imports System.io
Imports System.Security.Cryptography
Public Class clssha1
Public Shared Function metinsha(ByVal strmetin As String) As String
Dim textencoder As New UTF8Encoding()
Return temizle(bytesha(textencoder.GetBytes(strmetin)))
'Return textencoder.GetString(hashedbytes)
End Function
Public Shared Function dosyasha(ByVal strpath As String) As String
Dim a As FileStream
a = File.Open(strpath, FileMode.Open)
Return streamsha(a)
End Function
Public Shared Function bytesha(ByVal byteByte As Byte()) As String
Dim sha As New SHA1CryptoServiceProvider
Dim hashedbytes As Byte()
hashedbytes = sha.ComputeHash(byteByte)
sha.Clear()
sha = Nothing
Return temizle(BitConverter.ToString(hashedbytes))
End Function
Public Shared Function streamsha(ByVal stremStream As Stream) As String
Dim sha As New SHA1CryptoServiceProvider
Dim hashedbytes As Byte()
hashedbytes = sha.ComputeHash(stremStream)
Return temizle(BitConverter.ToString(hashedbytes))
End Function

Private Shared Function temizle(ByVal strSon As String) As String
Return strSon.Replace("-", "")
End Function
End Class
 

İşte bu kadar:)

 

 

Hepinize bol .netli günler

 

Tuna Toksöz