ASP.NET大文件下载的实现思路及代码

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

网站建设公司,为您提供网站建设,网站制作,网页设计及定制网站建设服务,专注于企业网站建设,高端网页制作,对成都湿喷机等多个行业拥有丰富的网站建设经验的网站建设公司。专业网站设计,网站优化推广哪家好,专业营销推广优化,H5建站,响应式网站。

 
 
  1. using System;
  2. namespace WebApplication1
  3. {
  4.     public partial class DownloadFile : System.Web.UI.Page
  5.     {
  6.         protected void Page_Load(object sender, EventArgs e)
  7.         {
  8.             System.IO.Stream iStream = null;
  9.             // Buffer to read 10K bytes in chunk:
  10.             byte[] buffer = new Byte[10000];
  11.             // Length of the file:
  12.             int length;
  13.             // Total bytes to read.
  14.             long dataToRead;
  15.             // Identify the file to download including its path.
  16.             string filepath = Server.MapPath("/") +"./Files/TextFile1.txt";
  17.             // Identify the file name.
  18.             string filename = System.IO.Path.GetFileName(filepath);
  19.             try
  20.             {
  21.                 // Open the file.
  22.                 iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
  23.                             System.IO.FileAccess.Read, System.IO.FileShare.Read);
  24.                 // Total bytes to read.
  25.                 dataToRead = iStream.Length;
  26.                 Response.Clear();
  27.                 Response.ClearHeaders();
  28.                 Response.ClearContent();
  29.                 Response.ContentType = "text/plain"; // Set the file type
  30.                 Response.AddHeader("Content-Length", dataToRead.ToString());
  31.                 Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
  32.                 // Read the bytes.
  33.                 while (dataToRead > 0)
  34.                 {
  35.                     // Verify that the client is connected.
  36.                     if (Response.IsClientConnected)
  37.                     {
  38.                         // Read the data in buffer.
  39.                         length = iStream.Read(buffer, 0, 10000);
  40.                         // Write the data to the current output stream.
  41.                         Response.OutputStream.Write(buffer, 0, length);
  42.                         // Flush the data to the HTML output.
  43.                         Response.Flush();
  44.                         buffer = new Byte[10000];
  45.                         dataToRead = dataToRead - length;
  46.                     }
  47.                     else
  48.                     {
  49.                         // Prevent infinite loop if user disconnects
  50.                         dataToRead = -1;
  51.                     }
  52.                 }
  53.             }
  54.             catch (Exception ex)
  55.             {
  56.                 // Trap the error, if any.
  57.                 Response.Write("Error : " + ex.Message);
  58.             }
  59.             finally
  60.             {
  61.                 if (iStream != null)
  62.                 {
  63.                     //Close the file.
  64.                     iStream.Close();
  65.                 }
  66.                 Response.End();
  67.             }
  68.         }
  69.     }
  70. }

关于此代码的几点说明:

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

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

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

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

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

分享文章:ASP.NET大文件下载的实现思路及代码
网站路径:http://www.mswzjz.com/qtweb/news8/180258.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联