桌面应用也能够提供HTTP文件下载

以往,咱们确定知道,在搞Web应用的时候,咱们均可能会遇到提供文件下载的功能需求,好比我之前作的一个客户许可证管理系统,客户购买ERP系统后,一般咱们会根据客户的机器的机器码生成一个许可文件,而这个许可文件是有时间限制的,一年后会过时,过时以后客户须要从新获取许可,以表示继续使用咱们的超级牛B产品,若是客户再也不获取许可,就代表客户再也不使用咱们的超级牛B产品。浏览器

后来一想,是啊,倒不如我们弄个Web程序,让客户自行登入,输入机器码后,自动生成许可文件,而后客户在页面上点击下载就好了。提供下载功能其实很常见,像许多软件下载站等。服务器

不过,咱们是否考虑过,若是咱们编写一个仅仅提供HTTP下载相关的少数功能的应用程序,咱们彷佛没有必要大动干戈在机器上弄个服务器搞个Web站点。一般这种状况,作个小小的窗口程序就能够完事了。因此,就会想到使用桌面应用程序来提供HTTP下载这想法了。async

 

其实,这个实现起来并不复杂,System.Net命名空间下提供了一个HttpListener类,它可监听客户端传入的HTTP请求,而后返回一个HttpListenerContext对象,再经过HttpListenerContext对象能够获得用于处理请求/响应有关的对象。测试

根据这个思路,咱们也能够轻松作到提供下载功能,原来和Web方式是同样的,就是在响应请求时插入Content-Disposition标头,值为attachment;filename=<文件名>的方法就能实现。编码

[csharp]  view plain  copy
 
  1. private async void btnListen_Click(object sender, EventArgs e)  
  2. {  
  3.     HttpListener listener = new HttpListener();  
  4.     listener.Prefixes.Add("http://+:80/download/");  
  5.     listener.Start();  
  6.     btnListen.Enabled = false;  
  7.     HttpListenerContext context = await listener.GetContextAsync();  
  8.     if (context != null)  
  9.     {  
  10.         // 添加Content-Disposition标头  
  11.         context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + WebUtility.UrlEncode( Path.GetFileName(lblFilePath.Text)));  
  12.         try  
  13.         {  
  14.             using (FileStream stream = File.OpenRead(lblFilePath.Text))  
  15.             {  
  16.                 // 添加内容说明符  
  17.                 context.Response.ContentType = MediaTypeNames.Application.Octet;  
  18.                 // 内容长度  
  19.                 context.Response.ContentLength64 = stream.Length;  
  20.                 // 回发数据给客户端  
  21.                 byte[] buffer = new byte[1024];  
  22.                 int n = stream.Read(buffer, 0, buffer.Length);  
  23.                 while (n > 0)  
  24.                 {  
  25.                     context.Response.OutputStream.Write(buffer, 0, n);  
  26.                     n = stream.Read(buffer, 0, buffer.Length);  
  27.                 }  
  28.                 context.Response.Close(); //关闭  
  29.             }  
  30.         }  
  31.         catch(Exception ex)  
  32.         {  
  33.             MessageBox.Show(ex.Message);  
  34.         }  
  35.     }  
  36.     listener.Stop(); //中止监听  
  37.     btnListen.Enabled = true;  
  38. }  

在设置filename时将文件名加上WebUtility.UrlEncode进行编码是防止当文件名中包含中文时呈现乱码。spa

而发送文件给客户端就简单多了,和普通的流操做没有区别,把从文件中读到的数据写入Response.OutputStream流中便可,发送完毕后,调用Close方法关闭HttpListenerResponse对象,所以处理已经完成,没有必再开着它占用资源。.net

监听地址为http://+:80/download/,表示HttpListener将监在80端口上的全部主机名接收到的请求,后面的路径中加上 download/ 只是为了避免与IIS的默认localhost地址冲突,由于我开启了IIS。code

运行后,选择一个文件,而后点击按钮开始监听。对象

 

随后在浏览器中输入 http://localhost/download/ ,按回车,就能够测试下载了。blog

相关文章
相关标签/搜索