silverlight webclient实现上传、下载、删除、读取文件
1.上传
1 private void Button_Click_1(object sender, RoutedEventArgs e) 2 { 3 OpenFileDialog openFileDialog = new OpenFileDialog() 4 { //弹出打开文件对话框要求用户自己选择在本地端打开的图片文件 5 Filter = "Jpeg Files (*.jpg)|*.jpg|All Files(*.*)|*.*", 6 Multiselect = false //不允许多选 7 }; 8 9 if (openFileDialog.ShowDialog() == true)//.DialogResult.OK) 10 { 11 //fileinfo = openFileDialog.Files; //取得所选择的文件,其中Name为文件名字段,作为绑定字段显示在前端 12 FileInfo fileinfo = openFileDialog.File; 13 14 if (fileinfo != null) 15 { 16 WebClient webclient = new WebClient(); 17 18 string uploadFileName = fileinfo.Name.ToString(); //获取所选文件的名字 19 20 #region 把文件上传到服务器上 21 22 Uri upTargetUri = new Uri(String.Format("http://localhost:" + HtmlPage.Document.DocumentUri.Port + "/WebClientUpLoadStreamHandler.ashx?fileName={0}", uploadFileName), UriKind.Absolute); //指定上传处理程序 23 24 webclient.OpenWriteCompleted += new OpenWriteCompletedEventHandler(webclient_OpenWriteCompleted); 25 webclient.Headers["Content-Type"] = "multipart/form-data";//"application/x-www-form-urlencoded";// 26 27 webclient.OpenWriteAsync(upTargetUri, "POST", fileinfo.OpenRead()); 28 webclient.WriteStreamClosed += new WriteStreamClosedEventHandler(webclient_WriteStreamClosed); 29 30 #endregion 31 32 } 33 else 34 { 35 MessageBox.Show("请选取想要上载的图片!!!"); 36 } 37 } 38 39 } 40 void webclient_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e) 41 { 42 43 //将图片数据流发送到服务器上 44 45 // e.UserState - 需要上传的流(客户端流) 46 Stream clientStream = e.UserState as Stream; 47 // e.Result - 目标地址的流(服务端流) 48 Stream serverStream = e.Result; 49 byte[] buffer = new byte[clientStream.Length]; 50 int readcount = 0; 51 // clientStream.Read - 将需要上传的流读取到指定的字节数组中 52 while ((readcount = clientStream.Read(buffer, 0, buffer.Length)) > 0) 53 { 54 // serverStream.Write - 将指定的字节数组写入到目标地址的流 55 serverStream.Write(buffer, 0, readcount); 56 } 57 serverStream.Close(); 58 clientStream.Close(); 59 } 60 void webclient_WriteStreamClosed(object sender, WriteStreamClosedEventArgs e) 61 { 62 //判断写入是否有异常 63 if (e.Error != null) 64 { 65 System.Windows.Browser.HtmlPage.Window.Alert(e.Error.Message.ToString()); 66 } 67 else 68 { 69 System.Windows.Browser.HtmlPage.Window.Alert("文件上传成功!!!"); 70 } 71 }
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Web; 6 7 namespace SilverlightApplication9.Web 8 { 9 /// <summary> 10 /// WebClientUpLoadStreamHandler 的摘要说明 11 /// </summary> 12 public class WebClientUpLoadStreamHandler : IHttpHandler 13 { 14 15 public void ProcessRequest(HttpContext context) 16 { 17 //获取上传的数据流 18 string fileNameStr = context.Request.QueryString["fileName"]; 19 20 Stream sr = context.Request.InputStream; 21 try 22 { 23 string filename = ""; 24 25 filename = fileNameStr; 26 27 byte[] buffer = new byte[4096]; 28 int bytesRead = 0; 29 //将当前数据流写入服务器端文件夹ClientBin下 30 string targetPath = context.Server.MapPath("Pics/" + filename); 31 32 using (FileStream fs = File.Create(targetPath, 4096)) 33 { 34 while ((bytesRead = sr.Read(buffer, 0, buffer.Length)) > 0) 35 { 36 //向文件中写信息 37 fs.Write(buffer, 0, bytesRead); 38 } 39 } 40 41 context.Response.ContentType = "text/plain"; 42 context.Response.Write("上传成功"); 43 } 44 catch (Exception e) 45 { 46 context.Response.ContentType = "text/plain"; 47 context.Response.Write("上传失败, 错误信息:" + e.Message); 48 } 49 finally 50 { sr.Dispose(); } 51 52 } 53 54 public bool IsReusable 55 { 56 get 57 { 58 return false; 59 } 60 } 61 } 62 }
2.下载
2.1下载方法1
1 #region 下载图片 2 SaveFileDialog sfd = null; 3 private void btnDownload_Click(object sender, RoutedEventArgs e) 4 { 5 //向指定的Url发送下载流数据请求 6 string imgUrl = "http://localhost:51896/Pics/Wildlife.wmv"; 7 Uri endpoint = new Uri(imgUrl); 8 sfd = new SaveFileDialog() 9 { 10 DefaultExt = "jpeg", 11 Filter = "Text files (*.jpeg)|*.jpeg|All files (*.*)|*.*", 12 FilterIndex = 2 13 }; 14 15 if (sfd.ShowDialog() == true) 16 { 17 18 Uri end1point = new Uri(imgUrl); 19 WebClient client = new WebClient(); 20 client.OpenReadCompleted += (ss, ee) => 21 { 22 Stream pngStream = ee.Result; 23 byte[] binaryData = new Byte[pngStream.Length]; 24 pngStream.Read(binaryData, 0, (int)pngStream.Length); 25 Stream stream = sfd.OpenFile(); 26 stream.Write(binaryData, 0, binaryData.Length); 27 stream.Close(); 28 29 }; 30 client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(clientDownloadStream_DownloadProgressChanged); 31 client.OpenReadAsync(endpoint); 32 } 33 34 } 35 36 void clientDownloadStream_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 37 { 38 //DownloadProgressChangedEventArgs.ProgressPercentage - 下载完成的百分比 39 //DownloadProgressChangedEventArgs.BytesReceived - 当前收到的字节数 40 //DownloadProgressChangedEventArgs.TotalBytesToReceive - 总共需要下载的字节数 41 //DownloadProgressChangedEventArgs.UserState - 用户标识 42 43 this.tbMsgString.Text = string.Format("完成百分比:{0} 当前收到的字节数:{1} 资料大小:{2} ", 44 e.ProgressPercentage.ToString() + "%", 45 e.BytesReceived.ToString(), 46 e.TotalBytesToReceive.ToString()); 47 48 } 49 50 #endregion
2.2下载方法2
1 private void btnDownload_Click(object sender, RoutedEventArgs e) 2 { 3 System.Windows.Browser.HtmlPage.Window.Eval("window.location.href='http://localhost:51896/download.ashx?filename=IMG_20140329_093302.jpg';"); 4 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 6 namespace SilverlightApplication9.Web 7 { 8 /// <summary> 9 /// download 的摘要说明 10 /// </summary> 11 public class download : IHttpHandler 12 { 13 private long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力 14 public void ProcessRequest(HttpContext context) 15 { 16 //string fileName = "123.jpg";//客户端保存的文件名 17 String fileName = context.Request.QueryString["filename"]; 18 string filePath = context.Server.MapPath(@"Pics/IMG_20140329_093302.jpg"); 19 System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath); 20 21 if (fileInfo.Exists == true) 22 { 23 byte[] buffer = new byte[ChunkSize]; 24 context.Response.Clear(); 25 System.IO.FileStream iStream = System.IO.File.OpenRead(filePath); 26 long dataLengthToRead = iStream.Length;//获得下载文件的总大小 27 context.Response.ContentType = "application/octet-stream"; 28 //通知浏览器下载文件而不是打开 29 context.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); 30 while (dataLengthToRead > 0 && context.Response.IsClientConnected) 31 { 32 int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小 33 context.Response.OutputStream.Write(buffer, 0, lengthRead); 34 context.Response.Flush(); 35 dataLengthToRead = dataLengthToRead - lengthRead; 36 } 37 context.Response.Close(); 38 context.Response.End(); 39 } 40 //context.Response.ContentType = "text/plain"; 41 //context.Response.Write("Hello World"); 42 } 43 44 public bool IsReusable 45 { 46 get 47 { 48 return false; 49 } 50 } 51 } 52 }
3.删除
1 private void WebClientCommand(string isDeleteParam, int sort) 2 { 3 string uploadFileName = null; 4 WebClient webclient = new WebClient(); 5 Uri upTargetUri = new Uri(String.Format("http://localhost:" + HtmlPage.Document.DocumentUri.Port + "/WebClientUpLoadStreamHandler.ashx?fileName={0}&result={1}", uploadFileName, isDeleteParam), UriKind.Absolute); 6 webclient.UploadStringCompleted += webclient_UploadStringCompleted; 7 webclient.UploadStringAsync(upTargetUri,""); 8 9 10 11 }
1 void webclient_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e) 2 { 3 if (e.Error == null) 4 { 5 EasySL.Controls.Window.Alert("删除成功", this.floatePanel); 6 } 7 }
1 using Huitu.Bjsq.Service; 2 using System; 3 using System.Collections.Generic; 4 using System.IO; 5 using System.Linq; 6 using System.Web; 7 8 namespace EasySL.Web 9 { 10 /// <summary> 11 /// WebClientUpLoadStreamHandler 的摘要说明 12 /// </summary> 13 public class WebClientUpLoadStreamHandler : IHttpHandler 14 { 15 public void ProcessRequest(HttpContext context) 16 { 17 //获取上传的数据流 18 string fileNameStr = context.Request.QueryString["fileName"]; 19 string paramResult = context.Request.QueryString["result"]; 20 Stream sr = context.Request.InputStream; 21 try 22 { 23 string filename = ""; 24 filename = fileNameStr; 25 byte[] buffer = new byte[4096]; 26 int bytesRead = 0; 27 if (!string.IsNullOrEmpty(paramResult)) 28 { 29 foreach (string item in paramResult.Split('|')) 30 { 31 string paramDel = context.Server.MapPath("FileLoad/" + item); 32 if (File.Exists(paramDel)) 33 { 34 File.Delete(paramDel); 35 context.Response.ContentType = "text/plain"; 36 context.Response.Write("删除成功"); 37 } 38 } 39 } 40 else 41 { 42 //将当前数据流写入服务器端文件夹ClientBin下 43 string targetPath = context.Server.MapPath("FileLoad/" + filename); 44 using (FileStream fs = File.Create(targetPath, 4096)) 45 { 46 while ((bytesRead = sr.Read(buffer, 0, buffer.Length)) > 0) 47 { 48 //向文件中写信息 49 fs.Write(buffer, 0, bytesRead); 50 } 51 } 52 context.Response.ContentType = "text/plain"; 53 context.Response.Write("上传成功"); 54 } 55 } 56 57 catch (Exception e) 58 { 59 context.Response.ContentType = "text/plain"; 60 context.Response.Write("上传失败, 错误信息:" + e.Message); 61 } 62 finally 63 { sr.Dispose(); } 64 } 65 66 public bool IsReusable 67 { 68 get 69 { 70 return false; 71 } 72 } 73 } 74 }
4.对于处理上传大文件的处理
1 <configuration> 2 <system.web> 3 <compilation debug="true" targetFramework="4.5" /> 4 <httpRuntime targetFramework="4.5" maxRequestLength="21048576" executionTimeout="7200" /> 5 </system.web> 6 </configuration>
5.将程序发布在iis上注意的问题(代码是VS服务器运行正常,但是发布到IIS后上传文件总是失败。后来发现,我发布到IIS的虚拟目录,所以路径变了。)
Uri uri = new Uri(string.Format("/DataHandler.ashx?filename={0}", fileName), UriKind.Relative);
// Uri uri = new Uri("http://localhost/SEManage/UploadImg.ashx", UriKind.Absolute);
WebClient client = new WebClient();
将Uri中的绝对路径,修改为相对路径
6.读取文件操作(.txt)
private void SetWeather() { WebClient downReader = new WebClient(); downReader.Encoding = System.Text.Encoding.UTF8; downReader.OpenReadCompleted += (s, e) => { if (e.Error == null) { using (StreamReader reader = new StreamReader(e.Result)) { string[] line = reader.ReadToEnd().Split('|'); } } } downReader.OpenReadAsync(new Uri("../AppConfig/Weather.txt", UriKind.Relative)); } private void WeatherDispatcherTimer() { //创建计时器 System.Windows.Threading.DispatcherTimer myWeatherTimer = new System.Windows.Threading.DispatcherTimer(); //创建间隔时间 myWeatherTimer.Interval = new TimeSpan(0, 3, 0, 0); //创建到达间隔时间后需执行的函数 myWeatherTimer.Tick += (ss, ee) => { InitDataWeather(); }; myWeatherTimer.Start(); }