桌面应用也可以提供HTTP文件下载
2013-07-18 17:46
531 查看
以往,我们肯定知道,在搞Web应用的时候,我们都可能会遇到提供文件下载的功能需求,比如我以前做的一个客户许可证管理系统,客户购买ERP系统后,通常我们会根据客户的机器的机器码生成一个许可文件,而这个许可文件是有时间限制的,一年后会过期,过期之后客户需要重新获取许可,以表示继续使用我们的超级牛B产品,如果客户不再获取许可,就表明客户不再使用我们的超级牛B产品。
后来一想,是啊,倒不如咱们弄个Web程序,让客户自行登入,输入机器码后,自动生成许可文件,然后客户在页面上点击下载就行了。提供下载功能其实很常见,像许多软件下载站等。
不过,我们是否考虑过,如果我们编写一个仅仅提供HTTP下载相关的少数功能的应用程序,我们似乎没有必要大动干戈在机器上弄个服务器搞个Web站点。通常这种情况,做个小小的窗口程序就可以完事了。所以,就会想到使用桌面应用程序来提供HTTP下载这想法了。
其实,这个实现起来并不复杂,System.Net命名空间下提供了一个HttpListener类,它可监听客户端传入的HTTP请求,然后返回一个HttpListenerContext对象,再通过HttpListenerContext对象可以得到用于处理请求/响应有关的对象。
根据这个思路,我们也可以轻松做到提供下载功能,原来和Web方式是一样的,就是在响应请求时插入Content-Disposition标头,值为attachment;filename=<文件名>的方法就能实现。
在设置filename时将文件名加上WebUtility.UrlEncode进行编码是防止当文件名中包含中文时呈现乱码。
而发送文件给客户端就简单多了,和普通的流操作没有区别,把从文件中读到的数据写入Response.OutputStream流中即可,发送完毕后,调用Close方法关闭HttpListenerResponse对象,因此处理已经完成,没有必再开着它占用资源。
监听地址为http://+:80/download/,表示HttpListener将监在80端口上的所有主机名接收到的请求,后面的路径中加上 download/ 只是为了不与IIS的默认localhost地址冲突,因为我开启了IIS。
运行后,选择一个文件,然后点击按钮开始监听。
随后在浏览器中输入 http://localhost/download/ ,按回车,就可以测试下载了。
示例比较简单,但我认为有实用价值,待会我把源码上传到资源区,提供给有需要的朋友。
后来一想,是啊,倒不如咱们弄个Web程序,让客户自行登入,输入机器码后,自动生成许可文件,然后客户在页面上点击下载就行了。提供下载功能其实很常见,像许多软件下载站等。
不过,我们是否考虑过,如果我们编写一个仅仅提供HTTP下载相关的少数功能的应用程序,我们似乎没有必要大动干戈在机器上弄个服务器搞个Web站点。通常这种情况,做个小小的窗口程序就可以完事了。所以,就会想到使用桌面应用程序来提供HTTP下载这想法了。
其实,这个实现起来并不复杂,System.Net命名空间下提供了一个HttpListener类,它可监听客户端传入的HTTP请求,然后返回一个HttpListenerContext对象,再通过HttpListenerContext对象可以得到用于处理请求/响应有关的对象。
根据这个思路,我们也可以轻松做到提供下载功能,原来和Web方式是一样的,就是在响应请求时插入Content-Disposition标头,值为attachment;filename=<文件名>的方法就能实现。
private async void btnListen_Click(object sender, EventArgs e) { HttpListener listener = new HttpListener(); listener.Prefixes.Add("http://+:80/download/"); listener.Start(); btnListen.Enabled = false; HttpListenerContext context = await listener.GetContextAsync(); if (context != null) { // 添加Content-Disposition标头 context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + WebUtility.UrlEncode( Path.GetFileName(lblFilePath.Text))); try { using (FileStream stream = File.OpenRead(lblFilePath.Text)) { // 添加内容说明符 context.Response.ContentType = MediaTypeNames.Application.Octet; // 内容长度 context.Response.ContentLength64 = stream.Length; // 回发数据给客户端 byte[] buffer = new byte[1024]; int n = stream.Read(buffer, 0, buffer.Length); while (n > 0) { context.Response.OutputStream.Write(buffer, 0, n); n = stream.Read(buffer, 0, buffer.Length); } context.Response.Close(); //关闭 } } catch(Exception ex) { MessageBox.Show(ex.Message); } } listener.Stop(); //停止监听 btnListen.Enabled = true; }
在设置filename时将文件名加上WebUtility.UrlEncode进行编码是防止当文件名中包含中文时呈现乱码。
而发送文件给客户端就简单多了,和普通的流操作没有区别,把从文件中读到的数据写入Response.OutputStream流中即可,发送完毕后,调用Close方法关闭HttpListenerResponse对象,因此处理已经完成,没有必再开着它占用资源。
监听地址为http://+:80/download/,表示HttpListener将监在80端口上的所有主机名接收到的请求,后面的路径中加上 download/ 只是为了不与IIS的默认localhost地址冲突,因为我开启了IIS。
运行后,选择一个文件,然后点击按钮开始监听。
随后在浏览器中输入 http://localhost/download/ ,按回车,就可以测试下载了。
示例比较简单,但我认为有实用价值,待会我把源码上传到资源区,提供给有需要的朋友。
相关文章推荐
- 关于桌面应用也可以提供HTTP文件下载
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- IIS虚拟目录内的视频文件访问出错:HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- C#Http文件下载(支持断点续传) 提供资源下载
- crawler_java应用集锦9:httpclient4.2.2的几个常用方法,登录之后访问页面问题,下载文件_设置代理
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- 超简单快速实现附件上传(各种格式文件)和下载显示(调用浏览器下载后选择可以打开的应用查看)
- HTTP 错误 404.3 - Not Found由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射
- WCF HTTP 错误 404.3 - Not Found(由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。)
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射
- 使用MFC提供的Http类下载和上传文件
- WCF HTTP 错误 404.3 - Not Found(由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。)
- 《JavaWeb---简单应用---服务器向客户端提供音乐资源(三)》--- 利用struts实现文件下载,下载时改变文件的名称
- [转自:My Program life]使用MFC提供的Http类下载和上传文件
- 服务器IIS无法提供某种扩展名的文件的下载或访问某种类型文件提示http 404 错误时的解决办法
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射
- 已经越狱的 iPhone、iPad 设备,当通过其自带的 safari 浏览器访问 ipa 应用下载网站时,利用 itms-services 协议,可以一键安装 ipa 文件的 iOS 应用
- Android 网络应用重点———使用HttpGet 下载apk文件并安装
- 转:100元寻找CMD命令下载http文件的方法,可以提价,非转换vbs的方案作品