0
点赞
收藏
分享

微信扫一扫

网站大文件下载 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;
// 在块中读取10K字节的缓冲区
byte[] buffer = new Byte[10000];
// 文件长度
int length;
// 要读取的总字节数 长数据存储区
// 标识要下载的文件,包括其路径
string filepath = Server.MapPath("/") +"./Files/TextFile1.txt";
// 标识文件名.
string filename = System.IO.Path.GetFileName(filepath);
try
{
// 打开文件
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.Read);
// 要读取的总字节数 dataToRead = IO流长度;
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "text/plain"; // 设置文件类型
Response.AddHeader("Content-Length", dataToRead.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
// 读取字节
while (dataToRead > 0)
{
// 验证客户端是否已连接
if (Response.IsClientConnected)
{
// 读取缓冲区中的数据
length = iStream.Read(buffer, 0, 10000);
// 将数据写入当前输出流
Response.OutputStream.Write(buffer, 0, length);
// 将数据刷新到HTML输出
Response.Flush();
buffer = new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
// 防止无限循环,(用户断开连接)
dataToRead = -1;
}
}
}
catch (Exception ex)
{
// 捕获错误
htm = htm&("Error : " + ex.Message);
}
finally
{
if (iStream != null)
{
// 关闭文件
iStream.Close();
}
// 结束当前线程
Response.End();
}
}
}
}

  • 根据下载的文件类型来指定 Response.ContentType
    ​文件类型对照表​​
  • 在每次写完response时记得调用 Response.Flush()
  • 在循环下载的过程中使用 Response.IsClientConnected 这个判断可以帮助程序尽早发现连接是否正常
  • 若不正常,可以及早的放弃下载,以释放所占用的服务器资源
  • 在下载结束后,需要调用 ​​Response.End()​​ 来保证当前线程可以在最后被终止掉


举报

相关推荐

0 条评论