Makale Özeti

Web Servislerini kullanarak dosya transfer ve listeleme işlemleri

Makale

Merhabalar;

         Bu makalede .Net Web Servisi kullanarak basitçe bir ftp hizmetinin nasıl sunulabileceği ve kullanıcının dosya transfer işlemlerini nasıl yapabileceğini inceleyeceğiz ve örneklerle daha anlaşılabir bir şekilde irdeleyeceğiz. Bir Web servisi, Internet üzerinde yeni bir uygulama türüdür. Ve Microsoft .NET ile de bir çok soruna çözüm olabilen populer bir yöntem olmuştur. Bir XML Web servisi güvenlik, kararlılık, hız gibi özellikleri sayesinde ön plana çıkar. Bu teknoloji sayesinde yapılabilecek en basit örnekler hava durumu bilgilerini, haberleri, spor müsabakaları sonuclarını internetten yayınlayarak diğer siteler tarafından kullanılmasını sağlamak veya bir sunucudan alınarak kullanılmasıdır. Ancak bu uygulamada xml web servisi kullanarak dosya upload download listeleme gibi işlemleri yapabileceğimiz bir yöntemi inceleyeceğiz.

   Imports System.IO
   Imports System.Web.Services

   <System.Web.Services.WebService(Namespace := "http://tempuri.org/WebServiceIleDosyaUpload/Service1")> _
   Public Class Service1
      Inherits System.Web.Services.WebService
       Dim root As String = "c:"
      +Web Services Designer Generated Code
         Web servisimizde dosya işlemleri yapacağımızdan servisimize System.IO namespace ini import etmeliyiz. Bunun yanı sıra general declarations ta tanımladığımız root isimli string değişken ise dosya işlemleri yapacağımız root(kök) dizini belirtecektir. Bu değişkeni kendi ihtiyaçlarımız doğrultusunda değiştirmemiz mümkündür. Burada unutulmaması gereken bir nokta web servisi bilgisayarımızda çalıştıran kullanıcının bu klasör üzerinde yetkili olmasıdır.

   <WebMethod()> _
   Public Function ListFiles(ByVal folder As String) As String()
      Dim files() As String
      Dim pathToList As String = root & "\" & folder
      files = Directory.GetFiles(pathToList)
      For i As Integer = 0 To files.Length - 1
         files(i) = files(i).Remove(0, pathToList.Length)
      Next
      Return files
   End Function
         Bu method da belirlediğimiz kök dizine veya kök dizinini altındaki belirtilmiş klasöre ait dosyalara GetFiles() metodu işle ulaşıyoruz. Bu metodun bize döndürdüğü metinsel dizinin içindeki elemanlar arasında bir döngü ile dolaşarak klasör yolunu çıkarıyoruz ve sadece dosya isimlerini elde etmiş oluyoruz.Oluşan bu string diziyi kullanıcıya geri döndürüyoruz.

   <WebMethod()> _
   Public Function ListDirectories(ByVal folder As String) As String()
      Dim directories() As String
      Dim pathToList As String = root & "\" & folder
      directories = Directory.GetDirectories(pathToList)
      For i As Integer = 0 To directories.Length - 1
         directories(i) = directories(i).Remove(0, pathToList.Length)
      Next
      Return directories
   End Function
         Bu method da ise dosyaları alırken uyguladığımız yöntem ve mantığın aynısını kullanıyoruz. Ancak bu sefer GetFiles() Methodu yerine GetDirectories() methodunu kullanıyoruz.

   <WebMethod()> _
   Public Function DeleteFile(ByVal folder As String, ByVal filename As String) As Boolean
      If Not folder = "" Then
         folder &= "\"
      End If
      Dim IsDeleted As Boolean
      If File.Exists(root & "\" & folder & filename) Then
         File.Delete(root & "\" & folder & filename)
         IsDeleted = True
      Else
         IsDeleted = False
      End If
      return IsDeleted
   End Function
          Bu method da kullanıcı tarafından gönderilen klasör ismi içinde belirtilen dosyanın bulunup bulunmadığı kontrol ediliyor ve eğer dosya varsa siliniyor ve silindiğini belirten boolean değişken true değerini alıyor. Ancak dosya mevcut değilse değişken false değerini alıyor. Kullanıcılar ise kendilerine geri döndürülen bu değişkenden dosyanın silinip silinmediğini anlayabiliyorlar.

   <WebMethod()> _
   Public Sub UploadFile(ByVal filename As String, ByVal folder As String, ByVal objFile As Byte())
      If Not folder = "" Then
         folder &= "\"
      End If
      If not File.Exists(root & "\" & folder & filename) Then
         Dim objFileStream As FileStream
         objFileStream = File.Open(root & "\" & folder & filename, FileMode.Create, FileAccess.Write)
         Dim lngLen As Long = objFile.Length - 1
         objFileStream.Write(objFile, 0, CType(lngLen, Integer))
         objFileStream.Close()
      End If
   End Sub
         Bu method da kullanıcıdan dosyanın yaratılacağı klasörü ve dosya ismini ve dosyanın içeriğini byte değişkeninden bir dizi değişkeni olarak alarak belirtilen klasörde bu byte dizisini sıra ile bir dosyaya yazarak dosyayı oluşturuyoruz. Bir dosyanın içeriğinin nasıl byte dizisi olarak yollanacağı bu makalenin ikici kısmındaki örnek windows uygulamasında açıklanmıştır.

   <WebMethod()> _
   Public Function DownloadFile(ByVal folder As String, ByVal filename As String) As Byte()
      If Not folder = "" Then
         folder &= "\"
      End If
      If File.Exists(root & "\" & folder & filename) Then
         Dim objStream As Stream
         Dim len As Integer
         objStream = File.Open(root & "\" & folder & filename, FileMode.Open, FileAccess.Read)
         len = objStream.Length
         Dim objFile(len) As Byte
         objStream.Read(objFile, 0, len)
         objStream.Close()
      End If
   End Function
End Class
         Bu method da ise kullanıcıdan dosyayı aldığımız mantığı kullanarak kullanıcının istediği dosyayı byte dizisi olarak biz kullanıcıya yollayacağız. Bu metodun kullanımı ile ilgili bir örnek ise makalenin ikinci kısmında örnek uygulamalar kısmında verilen windows uygulamasında gösterilmiştir.

         Web servisin bu kullanımında servisimize erişebilen her kullanıcının dosyalarımızı silebileceğini veya görebileceğini göz ardı etmek mümkün değildir. Bu ciddi güvenlik sorununu kullanıcılara database üzerinde tutulan bir kullanıcı adı veya şifre vermek suretiyle ve web servis dosya işlemini yapmadan önce bu kullanıcı adını ve şifreyi kontrol edip dosya işlemi yapmaya izni olup olmamasına göre hareket edecek bir kod yazmaktır. Bu çalışma öğrenim amaçlı olduğundan hata yakalama ve güvenlik fonksiyonları yazılmamıştır.

Tamer ÖZ

oztamer@hotmail.com
tamer.oz@yazgelistir.com
oztamer@hotmail.com