zoukankan      html  css  js  c++  java
  • Silverlight实用窍门系列:19.Silverlight调用webservice上传多个文件【附带源码实例】

            Silverlight不支持读写服务器端的硬盘,可是很多时候用户需要在Silverlight客户端往服务器端上传文件,那么本节将讲述Silverlight中最简单的上传文件的方式:在Silverlight客户端将文件序列化为Byte[]字符组,然后服务器端使用webService接收客户端的数据并且还原为文件即可。

            下面我们新建一个Silverlight应用程序解决方案SLUpload,然后在SLUpload.Web项目中鼠标右键点击此项目,添加一个web服务页面Upload。在此页面中写入下面代码:

    /// <summary>
    /// 上传文件
    /// </summary>
    /// <param name="FileByte">文件的字节</param>
    /// <param name="FileName">文件名</param>
    /// <param name="FileExtention">文件扩展名</param>
    /// <param name="SavePath">文件保存地址</param>
    /// <returns></returns>
    [WebMethod]
    public string Uploadfile(byte[] FileByte,string FileName,string SavePath)
    {
    //文件的保存位置
    string filepath = SavePath + FileName;
    //判断在该位置是否有相同的文件。有的话则删除原来同名的文件
    if (File.Exists(filepath))
    {
    //删除该位置的同名文件
    File.Delete(filepath);
    }
    //根据传入的byte[]数据和文件位置创建一个FileStream实例
    using (FileStream stream = new FileStream(filepath, FileMode.CreateNew))
    {
    //向文件中写入数据流
    stream.Write(FileByte, 0, FileByte.Length);
    };
    return FileName;
    }

            这个Web服务方法的参数分别代表传输过来的文件内容字节组、文件名、文件保存路径。对于方法中使用的相关操作都在上面源码中有说明,我就不多说了。下面我们在SLUpload项目中鼠标右键点击项目名,然后“添加服务引用”,填入SLUpload.Web的upload.asmx页面的Url地址并且命名空间填写为UpLoadService点击确定,即在SLUpload项目中引用了webservice服务。下面我们看MainPage.xaml的代码如下:

    <Grid x:Name="LayoutRoot" Background="White">
    <Button Content="上 传" Height="23" HorizontalAlignment="Left" Margin="20,36,0,0" Name="btnUpload" VerticalAlignment="Top" Width="75" Click="btnUpload_Click" />
    <ListBox Height="183" HorizontalAlignment="Left" Margin="112,36,0,0" Name="listBox1" VerticalAlignment="Top" Width="232" />
    <Button Content="清 空" Height="23" HorizontalAlignment="Left" Margin="20,88,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
            下面我们看MainPage.xaml.cs的关键代码,注意这里需要引用:using System.IO;using SLUpload.UpLoadService;这两个域名空间:
    private void btnUpload_Click(object sender, RoutedEventArgs e)
    {
    //设置一个选择文件的窗口的实例,并且设置为多选
    OpenFileDialog dialog = new OpenFileDialog();
    dialog.Multiselect
    =true;
    if (dialog.ShowDialog().Value)
    {
    //循环获取多选到的文件,然后将这些集合都通过调用webService上传
    foreach (FileInfo file in dialog.Files)
    {
    //读取Stream
    Stream stream = file.OpenRead();
    stream.Position
    = 0;
    //设置字节数组初始化
    byte[] buffer = new byte[stream.Length + 1];
    //将文件写入字节数组中
    stream.Read(buffer, 0, buffer.Length);
    string fileName = file.Name;
    //调用webService服务方法上传文件
    UploadSoapClient upfile = new UploadSoapClient();
    //设置缓冲区存取的字符、文件名称、文件保存路径,并且调用方法上传
    upfile.UploadfileAsync(buffer, fileName, "C:\\");
    upfile.UploadfileCompleted
    += new EventHandler<UploadfileCompletedEventArgs>(upfile_UploadfileCompleted);
    }
    }
    else
    {
    MessageBox.Show(
    "你没有选择文件,请重新选择文件!");
    }
    }
    void upfile_UploadfileCompleted(object sender, UploadfileCompletedEventArgs e)
    {
    this.listBox1.Items.Add(e.Result + "文件上传成功!");
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
    this.listBox1.Items.Clear();
    }

             这样一个最简单的Silverlight上传就做好了,但是在实际运行当中我们观察得出这种上传方式只能够上传小于2M的文件。那是因为ServiceReferences.ClientConfig文件的webService传输配置中设置的 maxBufferSize="2147483647" 。很显然,在实际中我们如果要传输大文件的话,就需要考虑将一个大文件切割成为数个小文件来进行传输。这是下一个话题。

             本实例采用VS2010+Silverlight 4.0编写。请点击 SLUpload.rar 下载源码实例。

  • 相关阅读:
    「日常训练」Single-use Stones (CFR476D2D)
    「日常训练」Greedy Arkady (CFR476D2C)
    「Haskell 学习」二 类型和函数(上)
    「学习记录」《数值分析》第二章计算实习题(Python语言)
    「日常训练」Alena And The Heater (CFR466D2D)
    Dubbo 消费者
    Dubbo 暴露服务
    Rpc
    git fail to push some refs....
    Spring Cloud (6)config 客户端配置 与GitHub通信
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/1970874.html
Copyright © 2011-2022 走看看