文件下载是一个网站最基本的功能,ASP.NET网站的文件下载功能实现也很简单,但是如果遇到大文件的下载而不做特殊处理的话,那将会出现不可预料的后果。本文就基于ASP.NET提供大文件下载的实现思路及代码。

  当我们的网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃。可以参考如下代码来避免这个问题。

using System;
namespace WebApplication1
{
public partial class DownloadFile : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
System.IO.Stream iStream = null;
// Buffer to read 10K bytes in chunk:
byte[] buffer = new Byte[10000];
// Length of the file:
int length;
// Total bytes to read.
long dataToRead;
// Identify the file to download including its path.
string filepath = Server.MapPath("/") +"./Files/TextFile1.txt";
// Identify the file name.
string filename = System.IO.Path.GetFileName(filepath);
try
{
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.Read);
// Total bytes to read.
dataToRead = iStream.Length;
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "text/plain"; // Set the file type
Response.AddHeader("Content-Length", dataToRead.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
// Read the bytes.
while (dataToRead > 0)
{
// Verify that the client is connected.
if (Response.IsClientConnected)
{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10000);
// Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, length);
// Flush the data to the HTML output.
Response.Flush();
buffer = new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
// Prevent infinite loop if user disconnects
dataToRead = -1;
}
}
}
catch (Exception ex)
{
// Trap the error, if any.
Response.Write("Error : " + ex.Message);
}
finally
{
if (iStream != null)
{
//Close the file.
iStream.Close();
}
Response.End();
}
}
}
}

  关于此代码的几点说明:

  1. 将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据。

  2. 根据下载的文件类型来指定 Response.ContentType 。(参考OSChina的这个网址可以找到大部分文件类型的对照表:http://tool.oschina.net/commons)

  3. 在每次写完response时记得调用 Response.Flush()

  4. 在循环下载的过程中使用 Response.IsClientConnected 这个判断可以帮助程序尽早发现连接是否正常。若不正常,可以及早的放弃下载,以释放所占用的服务器资源。

  5. 在下载结束后,需要调用 Response.End() 来保证当前线程可以在最后被终止掉。

最新文章

  1. JavaScript将字符串中的每一个单词的第一个字母变为大写其余均为小写
  2. Ajax 应用六个需要注意的事项
  3. SQLSERVER取当前月第一天和最后一天
  4. AC日记——整理药名 openjudge 1.7 15
  5. js Dialog 去掉右上角的X关闭功能
  6. poj3177 && poj3352 边双连通分量缩点
  7. paper 103:ELM算法
  8. Assert断言测试
  9. 用Quartus II 建立一个工程模板,以后新建工程时无需再配置参数
  10. 在WPF中自定义你的绘制(二)
  11. table+js实现网站左侧列表下拉隐藏
  12. 最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)
  13. QT界面应用程序的语言国际化
  14. C#中的委托到底是什么概念??
  15. JavaScript和DOM
  16. oracle 行列转换
  17. Java IO系列之三:NIO VS IO
  18. python全栈开发day66-视图系统、路由系统
  19. Oracle课程档案,第七天
  20. System.load()与System.loadLibrary()

热门文章

  1. [NOIP2014] 提高组 洛谷P2312 解方程
  2. 使用Eval()绑定数据时使用三元运算符
  3. Mac配置一些开发环境(随时补充)
  4. Django_collections01
  5. Docker入门教程(三)Dockerfile
  6. NXP Mifare S50标准IC卡- 访问位(Access Bits) 分析
  7. js002-在HTML中使用JavaScript
  8. N-Gram
  9. JavaScript的闭包原理
  10. 10月20日MySQL数据库作业解析