KMRT BSRN

"Hiç kimsenin ilgisine ihtiyaç duymadığın gün olgunlaşırsın. Hiç kimseden beklentiye girmediğin gün yara almazsın. Ve hiç kimseye bağımlı kalmazsan kazanırsın." OSHO

Silverlight – FileUpload İşlemleri

Yorum bırakın


Sözü fazla uzatmadan, hatta hiç uzatmadan önce sizi Daron Yöndem ‘in ilgili videosunu izlemeye davet ediyorum. DaronYöndem – File Upload

Ardından bu örneği biraz geliştirdim. Birden çok dosya ‘nın karşıya yüklenmesi ve yüklenirken ProgressBar ile yükleme ilerlemesinin takip edilmesini sağlayan. Yükleme işlemlerinde ilgili dosyaların yüklenmesinin başlamadan önce ve karşıya yüklendikten sonra tamamlanmasında, yükleme işleminin öncesinde ve tamamlanmasında ilgili olayların fırlatılmasını sağlayan şekilde kod örneğini biraz daha ileri bir aşamaya götürdüm. Umarım faydalı olur.. Açıklamaları ile beraber kod aşağıdadır..

 

UploadService.asmx
public class UploadService : System.Web.Services.WebService
{
    [WebMethod]
    public long GetFileLength(string fname) {
        // Gelen dosya isimli dosya varsa sunucudan boyutunu d?nd?r?r.
        // Aksi halde "0" d?ner..

        long result = 0;
        string path = Server.MapPath(".") + @"\" + fname;

        if (System.IO.File.Exists(path)) {
            System.IO.FileInfo fInfo = new System.IO.FileInfo(path);
            result = fInfo.Length;
        }

        return result;
    }

    [WebMethod]
    public long SetFileData(byte[] data, string fname) {
        // Verilen datay? ilgilisi dosyaya yazar.
        // Dosya yoksa olu?turur..

        long result = 0;
        string path = Server.MapPath(".") + @"\" + fname;
        MemoryStream ms = new MemoryStream(data);
        FileStream fs = null;

        if (System.IO.File.Exists(path)) {
            fs = System.IO.File.Open(path, FileMode.Append);
        }
        else {
            fs = System.IO.File.Open(path, FileMode.Create);
        }

        ms.WriteTo(fs); // Veriler yaz?l?r..
        result = fs.Length;

        ms.Close();
        ms.Dispose();
        fs.Close();
        fs.Dispose();

        return result;
    }
}

MainPage.xaml
<UserControl x:Class="FileUploadSample.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             Height="319"
             Width="293"
             xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

  <Grid x:Name="LayoutRoot"
        Background="White">
    <Button Content="Start Upload"
            Height="77"
            HorizontalAlignment="Left"
            Margin="55,38,0,0"
            Name="btnUpload"
            VerticalAlignment="Top"
            Width="154" />
    <ProgressBar Height="22"
                 HorizontalAlignment="Left"
                 Margin="12,166,0,0"
                 Name="prgCurrentUpload"
                 VerticalAlignment="Top"
                 Width="251" />
    <TextBlock Height="23"
               HorizontalAlignment="Left"
               Margin="12,137,0,0"
               Name="txtCurrentStatus"
               Text=""
               VerticalAlignment="Top"
               Width="251"
               TextAlignment="Center"
               FontWeight="Bold" />
    <ProgressBar Height="22"
                 HorizontalAlignment="Left"
                 Margin="12,243,0,0"
                 Name="prgGeneralUpload"
                 VerticalAlignment="Top"
                 Width="251" />
    <TextBlock FontWeight="Bold"
               Height="23"
               HorizontalAlignment="Left"
               Margin="12,214,0,0"
               Name="txtGeneralStatus"
               Text=""
               TextAlignment="Center"
               VerticalAlignment="Top"
               Width="251" />
  </Grid>
</UserControl>

MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;

namespace FileUploadSample
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            this.btnUpload.Click += new RoutedEventHandler(btnUpload_Click);
        }

        #region Events

        public event EventHandler PreUploading;          
        // Y?kleme ba?lamadan ?nce f?rlat?l?r.
        public event EventHandler UploadCompleted;       
        // Y?kleme tamamland???nda f?rlat?l?r.
        public event EventHandler<FileInfo> PreFileUploading;      
        // Y?kleme yap?lan her bir dosya ba?lang?c?nda, dosya bilgisi ile f?rlat?l?r.
        public event EventHandler<FileInfo> UploadFileCompleted;   
        // Y?kleme yap?lan her bir dosya tamamland???nda, dosya bilgisi ile f?rlat?l?r.

        #endregion

        #region Private Variables

        private FileStream _FS = null;
        private long _TotalLength = 0;
        private long _CurrentTotalLength = 0;
        private string _FileName = string.Empty;
        private FileInfo _CurrentFileInfo = null;
        private Queue<FileInfo> _FileQueue = null;
        private UploadServiceRef.UploadServiceSoapClient _Client = null;
        
        #endregion

        #region Properties

        /// <summary>
        /// Kuyrukta upload edilmeyi bekleyen dosyalar..
        /// Her bir dosya upload edildik?e kuyruktan ??kar?l?r..
        /// </summary>
        public Queue<FileInfo> FileQueue
        {
            get { return _FileQueue; }
            set { _FileQueue = value; }
        }

        /// <summary>
        /// ?u anki upload edilen dosyay? verir.
        /// </summary>
        public FileInfo CurrentFileInfo
        {
            get { return _CurrentFileInfo; }
            set { _CurrentFileInfo = value; }
        }

        /// <summary>
        /// Upload edilecek t?m dosyalar?n toplam b?yutunu verir.
        /// </summary>
        public long TotalLength
        {
            get { return _TotalLength; }
            set { _TotalLength = value; }
        }

        /// <summary>
        /// ?u an a kadar ki upload edilen dosyalar?n toplam boyutunu verir.
        /// </summary>
        public long CurrentTotalLength
        {
            get { return _CurrentTotalLength; }
            set { _CurrentTotalLength = value; }
        }
        
        #endregion

        #region Private Methods

        /// <summary>
        /// Upload s?ras?nda bekleyen di?er bir dosyaya ge?ilir.
        /// </summary>
        private void JumpToNextFile()
        {
            if (this.FileQueue.Count > 0)
            {
                // Upload edilecek dosya kuyruktan al?n?r.
                FileInfo fInfo = this.FileQueue.Dequeue();
                this._FileName = fInfo.Name;
                this._FS = fInfo.OpenRead();
                this.CurrentFileInfo = fInfo;

                if (this.PreFileUploading != null)
                    this.PreFileUploading(
                        this, new FileInfoEventArgs(this.CurrentFileInfo));

                // Dosya upload i?in g?nderilir.
                this._Client.GetFileLengthAsync(fInfo.Name);
            }
            else
            {
                // E?er kuyruktaki t?m dosyalar y?klendiyse;

                // ?lgili progress kontrol?n?n de?eri 100 yap?l?r. Y?kleme boyutu bilgis g?ncellenir.
                this.prgGeneralUpload.Value = 100;
                this.txtGeneralStatus.Text = this.TotalLength.ToString() +
                    " / " + this.TotalLength.ToString();

                if (this.UploadCompleted != null)
                    this.UploadCompleted(this, null);
            }
        }
        /// <summary>
        /// Upload i?leminde kullan?lacak olan Proxy in?a edilir.
        /// </summary>
        private void InitializeClientInstance()
        {
            this._Client = new UploadServiceRef.UploadServiceSoapClient();

            this._Client.GetFileLengthCompleted +=
                new EventHandler<uploadserv.getfilelengthcompletedeventargs>(Client_GetFileLengthCompleted);
            this._Client.SetFileDataCompleted +=
                new EventHandler<uploadserv.setfiledatacompletedeventargs="">(Client_SetFileDataCompleted);
        }
        
        #endregion

        #region Event Handlers

        private void btnUpload_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Resim Dosyalar?(*.jpg;*.jpeg;*.bmp;*.gif;*.png)|*.jpg;*.jpeg;*.bmp;*.gif;*.png|All Files(*.*)|*.*";
            ofd.Multiselect = true;

            if (ofd.ShowDialog() == true)
            {
                this.TotalLength = 0;
                this.CurrentTotalLength = 0;
                this.FileQueue = new Queue<FileInfo>(ofd.Files.Count());

                // Upload i?leminde kullan?lacak olan servis ?n
                // y?klemesi ve olay tan?mlar? yap?l?r.
                this.InitializeClientInstance();

                // Se?ilen dosyalar kuyru?a at?l?r..
                foreach (FileInfo fi in ofd.Files)
                {
                    this.TotalLength += fi.Length;
                    this.FileQueue.Enqueue(fi);
                }

                if (this.PreUploading != null)
                    this.PreUploading(this, null);

                // Kuyruktan bir dosya okunarak upload i?lemi ba?lat?l?r..
                this.JumpToNextFile();
            }
        }
        private void Client_GetFileLengthCompleted(object sender, UploadServiceRef.GetFileLengthCompletedEventArgs e)
        {
            // Kar?? tarafta ilgili dosya yoksa olu?turulur. (e.Result = 0 d?ner.)
            // Kar?? tarafta ilgili dosya varsa boyutu okunarak kald???
            // konumdan devam edilir. (e.Result = … dosya boyutu d?ner.)
            byte[] data = new byte[10000];
            _FS.Seek(e.Result, SeekOrigin.Begin);   
            // Dosyan?n ilgili konumuna gidilir.
            _FS.Read(data, 0, data.Length);         
            // Yakla??k 10 KB 'l?k veri okunur.

            // Okunan veri sunucu'ya yollan?r.
            this._Client.SetFileDataAsync(data, this._FileName);
        }
        private void Client_SetFileDataCompleted(object sender, UploadServiceRef.SetFileDataCompletedEventArgs e)
        {
            if (e.Result < this._FS.Length)
            {
                this.CurrentTotalLength += 10000;

                // Y?klenmi? dosya boyutu hesaplan?r.
                double uplodedFile = (double)e.Result;
                double totalFile = (double)this._FS.Length;
                double valueFile = (uplodedFile / totalFile) * 100;             
                // Y?klenmi? dosya i?in ProgressBar de?eri hesaplan?r.

                // Y?klenmi? toplam dosyalar boyutu hesaplan?r.
                double currentTotalLength = (double)this.CurrentTotalLength;
                double totalLength = (double)this.TotalLength;
                double valueTotal = (currentTotalLength / totalLength) * 100;   
                // Y?klenmi? dosyalar i?in ProgressBar de?eri hesaplan?r.

                // Y?klenmi? dosya bilgileri ekrana set edilir.
                this.prgCurrentUpload.Value = valueFile;
                this.txtCurrentStatus.Text = e.Result.ToString() + " / " +
                    this._FS.Length.ToString();

                // Y?klenmi? dosyalar?n bilgileri ekrana set edilir.
                this.prgGeneralUpload.Value = valueTotal;
                this.txtGeneralStatus.Text = this.CurrentTotalLength.ToString() +
                    " / " + this.TotalLength.ToString();

                // Dosya sonuna gelinmediyse veri okunarak upload i?lemine devam edilir.
                byte[] data = new byte[10000];
                _FS.Read(data, 0, data.Length);

                this._Client.SetFileDataAsync(data, this._FileName);
            }
            else
            {
                // Dosya y?klemesi tamamland? ise..
                this.prgCurrentUpload.Value = 100;
                this.txtCurrentStatus.Text = this._FS.Length.ToString() +
                    " / " + this._FS.Length.ToString();

                if (this.UploadFileCompleted != null)
                    this.UploadFileCompleted(this, new FileInfoEventArgs(this.CurrentFileInfo));

                // Kuyruktan ba?ka bir dosya al?narak upload i?lemi devam eder.
                this.JumpToNextFile();
            }
        }
        
        #endregion
    }

    public class FileInfoEventArgs : EventArgs
    {
        public FileInfo CurrentFileInfo { get; set; }

        public FileInfoEventArgs(FileInfo _finfo)
            : base()
        {
            this.CurrentFileInfo = _finfo;
        }
    }
}

Proje dosyası ise burada;

http://cid-f2e617aff724ee2b.office.live.com/embedicon.aspx/Makalelerim/FileUploadSample.rar

Reklamlar

Yazar: K. Murat BAŞEREN, MBA, MCP

I am a senior software developer, MCP, consultant, blogger, former chemist and software trainer. My interests range from software developer to technology. I am also interested in web development, education, and coffee.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s