Silverlight上傳下載三種方法解析(三)

WebService思路及功能實現

實現思路:通過添加Web服務來實現

上傳功能實現

一.獲得本地文件並轉化爲字節數組傳入到服務端

private void buttonUpload_Click(object sender, RoutedEventArgs e)

{

OpenFileDialog openFileDialog = new OpenFileDialog();

System.IO.Stream uploadStream = null;

openFileDialog.Filter = "Jpeg Files (*.jpg)|*.jpg|All Files(*.*)|*.*";

openFileDialog.Multiselect = false;

if (openFileDialog.ShowDialog()==true)

{

fileinfo = openFileDialog.File;

uploadStream = fileinfo.OpenRead();

byte[] buffer = new byte[uploadStream.Length];

//將選擇的文件信息流寫入到字節數組中

uploadStream.Read(buffer, 0, buffer.Length);

                 if (fileinfo!=null)

                 {

                        c.ActionUploadCompleted += new EventHandler<AsyncCompletedEventArgs>(c_ActionUploadCompleted);

                        c.ActionUploadAsync(fileinfo.Name, buffer, true);

                 }

         }

}

二.服務端捕獲字節數組並還原文件

/// <summary>

/// 上傳功能

/// </summary>

/// <param name="fileName">文件名</param>

/// <param name="fileData">字節流</param>

/// <param name="isApplend">是否追加</param>

[WebMethod]

public void ActionUpload(string fileName, byte[] fileData, bool isApplend)

{

             if (!Directory.Exists(uploadFolder))

             {

                   Directory.CreateDirectory(uploadFolder);

             }

             FileMode fileMode = isApplend ? FileMode.Append : FileMode.Create;

            using(FileStream fs=new FileStream(uploadFolder+@"\"+fileName,fileMode,FileAccess.Write))

           {

                      fs.Write(fileData,0,fileData.Length);

          }

}

下載功能實現

一.客戶端傳入下載文件名,服務端捕獲文件名並傳回該文件的字節數組

客戶端代碼:

private void buttonBase_Click(object sender, RoutedEventArgs e)

{

              UploadFileWebServiceSoapClient c2 = new UploadFileWebServiceSoapClient();

              SaveFileDialog saveDialog = new SaveFileDialog();

              saveDialog.Filter = "Jpeg Files (*.jpg)|*.jpg|All Files(*.*)|*.*";

             //給下載文件一個默認的Name

             saveDialog.DefaultFileName = "yl";

             if (listBox1.SelectedItems.Count < 0)

            {

                      MessageBox.Show("請選擇要下載的下載文件");

             }

             else if (listBox1.SelectedItems.Count > 1)

             {

                      MessageBox.Show("暫不提供批量下載");

              }

               else

              {

                      if (saveDialog.ShowDialog()==true)

                     {

                               c2.getBinaryFileCompleted += new EventHandler<getBinaryFileCompletedEventArgs>(c2_getBinaryFileCompleted);

                                c2.getBinaryFileAsync(listBox1.SelectedItem.ToString(),saveDialog);

                      }

               }

     }

    服務端代碼:

/// <summary>

/// 返回下載文件的字節流,直接返回一個Stream流怎麼老是返回不了呢。悲哀

/// </summary>

/// <param name="filename"></param>

/// <returns></returns>

[WebMethod]

public byte[] getBinaryFile(string filename)

                 {

                          string downloadsorcepath = uploadFolder + @"\" + filename;

                          if (File.Exists(downloadsorcepath))

                         {

                                try

                               {

                                         FileStream s2 = File.OpenRead(downloadsorcepath);

                                          byte[] downloadbyte = new byte[s2.Length];

                                          s2.Read(downloadbyte, 0, downloadbyte.Length);

                                          s2.Close();

                                          return downloadbyte;

                               }

                              catch (Exception)

                              {

                                         return new byte[0];

                              }

                      }

                      else

                      {

                           return new byte[0];

                      }

}

二.客戶端捕獲服務端傳回的字節數組,並還原文件保存在本地

void c2_getBinaryFileCompleted(object sender, getBinaryFileCompletedEventArgs e)

{

           if (e.Error==null)

          {

                byte[] mybyte = new byte[e.Result.Length];

                mybyte = e.Result;

                SaveFileDialog saveDialog = (SaveFileDialog)e.UserState;

               using (Stream stream =saveDialog.OpenFile())

               {

                     stream.Write(mybyte, 0, mybyte.Length);

               }

          }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章