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

2016-08-20 11:10:43来源:http://chengxingliang.blog.51cto.com/3972944/821960作者:程兴亮人点击


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


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



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

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


<Gridx:Name="LayoutRoot"Background="White"><ButtonContent="上传"Height="23"HorizontalAlignment="Left"Margin="20,36,0,0"Name="btnUpload"VerticalAlignment="Top"Width="75"Click="btnUpload_Click"/><ListBoxHeight="183"HorizontalAlignment="Left"Margin="112,36,0,0"Name="listBox1"VerticalAlignment="Top"Width="232"/><ButtonContent="清空"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;这两个域名空间:


privatevoidbtnUpload_Click(objectsender,RoutedEventArgse){//设置一个选择文件的窗口的实例,并且设置为多选OpenFileDialogdialog=newOpenFileDialog();dialog.Multiselect=true;if(dialog.ShowDialog().Value){//循环获取多选到的文件,然后将这些集合都通过调用webService上传foreach(FileInfofileindialog.Files){//读取StreamStreamstream=file.OpenRead();stream.Position=0;//设置字节数组初始化byte[]buffer=newbyte[stream.Length+1];//将文件写入字节数组中stream.Read(buffer,0,buffer.Length);stringfileName=file.Name;//调用webService服务方法上传文件UploadSoapClientupfile=newUploadSoapClient();//设置缓冲区存取的字符、文件名称、文件保存路径,并且调用方法上传upfile.UploadfileAsync(buffer,fileName,"C://");upfile.UploadfileCompleted+=newEventHandler<UploadfileCompletedEventArgs>(upfile_UploadfileCompleted);}}else{MessageBox.Show("你没有选择文件,请重新选择文件!");}}voidupfile_UploadfileCompleted(objectsender,UploadfileCompletedEventArgse){this.listBox1.Items.Add(e.Result+"文件上传成功!");}privatevoidbutton1_Click(objectsender,RoutedEventArgse){this.listBox1.Items.Clear();}

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


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




最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台