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编写。请点击 下载源码实例。