19.Silverlight调用webservice上传多个文件-阿里云开发者社区

开发者社区> 科技小能手> 正文

19.Silverlight调用webservice上传多个文件

简介:
+关注继续查看

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

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

 


  1. /// <summary> 
  2. /// 上传文件 
  3. /// </summary> 
  4. /// <param name="FileByte">文件的字节</param> 
  5. /// <param name="FileName">文件名</param> 
  6. /// <param name="FileExtention">文件扩展名</param> 
  7. /// <param name="SavePath">文件保存地址</param> 
  8. /// <returns></returns
  9. [WebMethod] 
  10. public string Uploadfile(byte[] FileByte,string FileName,string SavePath) 
  11. //文件的保存位置 
  12. string filepath = SavePath + FileName; 
  13. //判断在该位置是否有相同的文件。有的话则删除原来同名的文件 
  14. if (File.Exists(filepath)) 
  15. //删除该位置的同名文件 
  16. File.Delete(filepath); 
  17. //根据传入的byte[]数据和文件位置创建一个FileStream实例 
  18. using (FileStream stream = new FileStream(filepath, FileMode.CreateNew)) 
  19. //向文件中写入数据流 
  20. stream.Write(FileByte, 0, FileByte.Length); 
  21. }; 
  22. return FileName; 

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


  1. <Grid x:Name="LayoutRoot" Background="White"
  2. <Button Content="上 传" Height="23" HorizontalAlignment="Left" Margin="20,36,0,0" Name="btnUpload" VerticalAlignment="Top" Width="75" Click="btnUpload_Click" /> 
  3. <ListBox Height="183" HorizontalAlignment="Left" Margin="112,36,0,0" Name="listBox1" VerticalAlignment="Top" Width="232" /> 
  4. <Button Content="清 空" Height="23" HorizontalAlignment="Left" Margin="20,88,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
  5. </Grid> 

        下面我们看MainPage.xaml.cs的关键代码,注意这里需要引用:using System.IO;using SLUpload.UpLoadService;这两个域名空间:


  1. private void btnUpload_Click(object sender, RoutedEventArgs e) 
  2.   { 
  3.       //设置一个选择文件的窗口的实例,并且设置为多选 
  4.       OpenFileDialog dialog = new OpenFileDialog(); 
  5.       dialog.Multiselect=true
  6.      if (dialog.ShowDialog().Value) 
  7.       { 
  8.          //循环获取多选到的文件,然后将这些集合都通过调用webService上传 
  9.           foreach (FileInfo file in dialog.Files) 
  10.           { 
  11.               //读取Stream 
  12.               Stream stream = file.OpenRead(); 
  13.               stream.Position = 0; 
  14.               //设置字节数组初始化 
  15.               byte[] buffer = new byte[stream.Length + 1]; 
  16.               //将文件写入字节数组中   
  17.               stream.Read(buffer, 0, buffer.Length); 
  18.               string fileName = file.Name
  19.               //调用webService服务方法上传文件 
  20.               UploadSoapClient upfile = new UploadSoapClient(); 
  21.               //设置缓冲区存取的字符、文件名称、文件保存路径,并且调用方法上传 
  22.               upfile.UploadfileAsync(buffer, fileName, "C:\\"); 
  23.               upfile.UploadfileCompleted += new EventHandler<UploadfileCompletedEventArgs>(upfile_UploadfileCompleted); 
  24.           } 
  25.       } 
  26.       else 
  27.       { 
  28.           MessageBox.Show("你没有选择文件,请重新选择文件!"); 
  29.       } 
  30.   } 
  31.   void upfile_UploadfileCompleted(object sender, UploadfileCompletedEventArgs e) 
  32.   { 
  33.       this.listBox1.Items.Add(e.Result + "文件上传成功!"); 
  34.   } 
  35.  
  36.   private void button1_Click(object sender, RoutedEventArgs e) 
  37.   { 
  38.       this.listBox1.Items.Clear(); 
  39.   } 

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

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



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/821960

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
钉钉机器人调用函数计算实现serverless web服务:传统门禁的简单改造,懒惰癌的福音
本文通过钉钉机器人调用函数计算实现的serverless web服务,打通物联网平台,和树莓派实时通讯。实现了将原有传统的磁吸门禁,改造成可以由钉钉来控制开门的简单应用。
2236 0
使用SQLCMD在SQLServer执行多个脚本
原文: 使用SQLCMD在SQLServer执行多个脚本 概述:          作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个sql文件,并且有执行顺序,如我现在工作的公司,十几个客户,每个客户一个库,但是数据库结构、存储过程、视图等都是一模一样,每次执行脚本(以下称为升级),如果有一百个脚本,那么就要按顺序执行过千次,这种工作量可不是一个人能承受得了的。
820 0
Windows7中使用Task Scheduler调用WinScp批处理实现上传下载文件
上一个随笔中我们提到了在Windows 7操作系统中配置ftp服务器并通过WinScp客户端来访问它,这样就可以方便的上传下载文件了。现在又有新的问题,我们发现如果项目中的文件很多,成百上千个文件,即使WinScp提供方便的文件拖拽功能,还是发现很繁杂。
708 0
SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)
原文:SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases) 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems)...
1204 0
未能加载文件或程序集System.EnterpriseServices
未能加载文件或程序集“System.EnterpriseServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。
581 0
vnc操作使用指南----开启多个VNCserver
应用场景 在上面博客中介绍了一台Linux服务器上开启一个VNCServer,然后通过Windows端的VNCviewer去连接该Linux,最后可以在Windiwos系统中,远程看到Linux的系统界面。
2192 0
23706
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载