zoukankan      html  css  js  c++  java
  • 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);

                   }

              }

    }


    作者:yidifanhua
    出处:http://www.cnblogs.com/yidifanhua/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    code3728 联合权值
    Codevs 4600 [NOI2015]程序自动分析
    code1540 银河英雄传说
    code1074 食物链
    堆排序
    哈夫曼树与哈夫曼码
    优先队列用法
    code1154 能量项链
    code1225 八数码Bfs
    javascript5
  • 原文地址:https://www.cnblogs.com/yidifanhua/p/2122721.html
Copyright © 2011-2022 走看看