教程集 www.jiaochengji.com
教程集 >  脚本编程  >  Asp.net  >  正文 ASP.NET 大文件下载程序与思路原理

ASP.NET 大文件下载程序与思路原理

发布时间:2016-11-29   编辑:jiaochengji.com
教程集为您提供ASP.NET 大文件下载程序与思路原理等资源,欢迎您收藏本站,我们将为您提供最新的ASP.NET 大文件下载程序与思路原理资源
文件下载如果是小文件可以直接下载了,但是对于大文件处理上有一些区别了,下面我们来看一个ASP.NET 大文件下载程序与思路原理,希望文章对各位有帮助。

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

 

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy3001')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy3001>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();
            }
        }
    }
} </td></tr></table>


关于此代码的几点说明

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

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

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

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

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

您可能感兴趣的文章:
Asp.net动态生成html页面的实例详解
asp.net防止页面刷新重复提交的代码
ASP.NET 入门的五个步骤
asp与asp.net的session共享
Windows 2003下安装VS2008时.NetFramework3.5组件安装失败的解决方法
asp.net 保留文件夹介绍
ASP.NET 大文件下载程序与思路原理
ASP.Net中程序构架与程序代码的分离
用WinDbg探索CLR世界 [3] 跟踪方法的 JIT 过程
组件访问被拒绝 --“/”应用程序中的服务器错误的解决方法

[关闭]
~ ~