最近總是有人問如何通過Silverlight上傳圖片并保存的后臺服務器?眾所周知,Silverlight是客戶端程序,不能很好與服務器進行“溝通”,上傳圖片的方法呢大致都是通過以下流程:
1、客戶端獲取圖片-->2、轉換能夠傳輸?shù)臄?shù)據(jù)-->3、傳遞數(shù)據(jù)到服務端-->4、服務端還原數(shù)據(jù)為圖片
第一步和第四步?jīng)]有問題,問題大多出在第二步和第三步,如何得到客戶端和服務端都能識別并且容易傳遞的數(shù)據(jù)呢?
如果你使用的客戶端和服務端都是.NET方案,這就非常好辦,可以通過下面的方法:
1、客戶端得到客戶選擇的FileInfo,然后通過WebClient方法post到服務端,服務端再還原成圖片即可,詳細文章http://www.jfrwli.cn/article/201566.html
2、客戶端將客戶選擇的圖片文件轉換成FileStream包裹在一個類中通過WCF傳遞到服務端,服務端再還原,詳細文章http://www.jfrwli.cn/article/201567.html
有些同學會抓耳撓腮的問,難道就沒有人用silverlight傳遞到類似JAVA,PHP的情況嗎?當然有,而且我最近碰到的都是這類似的情況,事先聲明我不是實在不了解JAVA和PHP,我只能將圖片轉換成byte給你,至于你怎么還原,我只能說:”同學,任重而道遠!“,不廢話了,下面見分析:
之前走了不少彎路,總是想著將WriteableBitmap轉換成byte(也不知道是誰上來就讓用WriteableBitmap轉,T_T),后來我才發(fā)現(xiàn)其實完全沒必要這么麻煩,直接上代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
byte [] staticByte; //全局byte,為將byte轉換為Image private void OpenImage() { OpenFileDialog imageFile = new OpenFileDialog() { Filter = "Jpeg Files (*.jpg)|*.jpg|All Files(*.*)|*.*" }; if (imageFile.ShowDialog() == true ) { System.IO.Stream fileStream=imageFile.File.OpenRead(); byte [] imageByte= new byte [fileStream.Length]; //設置byte的長度為文件流的長度 fileStream.Read(imageByte,0,imageByte.Length); //將文件流信息讀取到byte數(shù)組中 staticByte = imageByte; //將讀取好的byte數(shù)組保存到全局 byteTextBox.Text=UTF8Encoding.UTF8.GetString(imageByte,0,imageByte.Length); //將byte數(shù)組顯示到前臺 } } |
直接通過FileStream.Read方法將文件流轉換成byte,ok完工!
后面我加了一點代碼將byte又轉換成圖片,代碼如下:
1
2
3
4
5
6
7
8
|
private void button1_Click( object sender, RoutedEventArgs e) { OpenImage(); MemoryStream memoryStream = new MemoryStream(staticByte,0,staticByte.Length); //將byte轉換為內(nèi)存流 BitmapImage img = new BitmapImage(); img.SetSource(memoryStream); //設置BitmapImage的源為內(nèi)存流 this .image1.Source = img; //顯示圖片 } |
程序圖片
選擇圖片界面
效果界面
程序源碼
使用vs2010 sp1+silverlight5編寫,SilverlightImageToByte