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 下载源码实例。

  • 相关阅读:
    线性Softmax分类器实战
    线性SVM分类器实战
    今日心得:读书
    今日心得:正能量
    Excel导出POI
    mysql数据库操作命令
    git常用命令
    list对象 利用Map去除对象中字段的重复
    SpringMVC 利用POI的Excel导出
    利用ajax进行页面加载进行信息展示时,一直不提加载,转圈,不反回问题。
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/1970874.html
Copyright © 2011-2022 走看看