Silverlight 2.0 içerisinden Download penceresi açtırmak.

0 dakikada yazıldı

6015 defa okundu

Düzenle

Silverlight 2.0 Beta 2 içerisinde istemci makinedeki herhangi bir
dosyaya ulaşmakla ilgili örneklerimizde Open File Dialog nesnesini
detayları ile incelemiştik. Tam zıttı bir senaryoda da kullanıcıya
sistemine kaydedebileceği bir dosya vermek isteyebiliriz. Bu gibi bir
çözüm için maalesef Save File Dialog gibi bir kontrole sahip değiliz. O
nedenle biraz farklı bir taktik uygulayarak kullanıcıya vermek
istediğimiz dosyayı ilk olarak sunucuya göndererek kaydedeceğiz
sonrasında da sunucudan dosyayı tekrar istemcinin alarak
kaydedebilmesini sağlayacağız. Bu senaryo ilk bakışta çok saçma gibi
gözükse de aslında dosya yaratma işlemini sunucu tarafında yaparsanız
herhangi bir performans sorunu olmayacaktır. Gönül isterdi ki dosyayı
tamamen istemcide Silverlight ile yaratarak kullanıcıya verebilelim.
Fakat maalesef şimdilik en azından Beta 2 içerisinde böyle bir şansımız
yok.

Peki herşeyi yaptık, dosyamızı Silverlight 2.0 Beta 2 ile yarattık,
sunucuya bir web servisi aracılığı ile gönderdik ve kaydettik. Bundan
sonrasında bu dosyayı Silverlight içerisinden istemcideki kullanıcıya
nasıl vereceğiz. Kullanacağımız taktik aslında epeyce basit. Tüm
tarayıcılarda kullanıcıyı dosya downloadu için dosyanın bulunduğu adrese
yönlendirirseniz hemen "Download" penceresi açılacaktır. Kullanıcının
içerisinde bulunduğu web sayfası hala görüntülenmeye devam edecektir.
Yani aslında siz kullanıcıyı başka bir adrese yönlendiriyor olsanız da
söz konusu adreste bir sayfa olmadığı için görüntüde bir değişiklik
olmayacak ve hedef adresteki dosyanın download işlemi başlayacaktır. Biz
de Silverlight tarafından bu taktikten faydalanacağız ve sayfanın
adresini kullanıcının indirmesini istediği adres ile değiştirerek
tarayıcının "Save File Dialog" açmasını sağlayacağız.

[VB]

        Dim Adres As Uri

       
Uri.TryCreate(System.Windows.Browser.HtmlPage.Document.DocumentUri,
New Uri("indir.zip", UriKind.Relative), Adres)

[C#]

            Uri Adres;

            Uri.TryCreate(System.Windows.Browser.HtmlPage.Document.DocumentUri, new Uri("teklialtyazi.zip", UriKind.Relative), out Adres);

İlk olarak kullanıcıyı yönlendirmek istediğimiz adresi oluşturmamız
gerek. Bunun için Uri sınıfındaki TryCreate metodunu
kullanacağız. Bu metod bizden bir base Uri ve Relative Uri
alarak ikisini birleştirebiliyor. Base Url için içerisinde
bulunduğumuz sayfanın adresini
System.Windows.Browser.HtmlPage.Document.DocumentUri ile veriyoruz,
relative Uri için yeni bir Uri değişkeni yaratıp download
edilecek olan dosyanın adını veriyoruz. Son olarak da almak sonucun
aktarılacağı yeni Uri değişkenimizi referans olarak aktarıyoruz.

[VB]

        CType(System.Windows.Browser.HtmlPage.Document.GetProperty("location"),
System.Windows.Browser.ScriptObject).SetProperty("href", Adres.ToString)

[C#]

            ((System.Windows.Browser.ScriptObject)System.Windows.Browser.HtmlPage.Document.GetProperty("location")).SetProperty("href", Adres.ToString());

Simdi yapmamız gereken ise sayfanın adresini bir önceki adımda elde
ettiğimiz adres ile değiştirmek. İlk olarak
System.Windows.Browser.HtmlPage.Document.GetProperty ile sayfadaki
dokümanın location özelliğini alıyoruz. Sonrasında da dokümanı bir
ScriptObject'e cast ederek SetProperty ile href özelliğini
değiştiriyoruz. Aslında bunu biraz JavaScript'teki
document.location.href özelliğine benzetebilirsiniz. Artık kodumuzu
çalıştırdığımızda Silverlight içerisinde herhangi bir düğmeye
basıldığında otomatik olarak tarayıcının "Save File Dialog" penceresi
açılacak ve kullanıcı istediği dosyayı Silverlight tarafından
indirebilecek.

Hepinize kolay gelsin.