always there for you

善于生活,善于学习,这是我和你的目标.

« Asp 代码压缩重要文件 »

关于网页下载-C#

 Msdn:参考地址

   以前在Web网站里做文件下载时,都是直接连接这个下载的文件.这个文件必须是浏览器打不开的,才能出现下载提示!.但在很多时候这种方法限制了我们.
  引用:
您的用户极有可能需要从贵组织的网站下载文件。既然提供下载和提供链接一样容易,您当然不需要去阅读有关此过程的文章,对吧?但随着 Web 领域的巨大进步,我们有很多理由可以相信,这个过程不一定像我们想像的那么容易。也许您希望将文件作为一个文件下载,而不是作为内容在浏览器中显示。也许您还不知道这些文件的路径(或者它们根本就不在磁盘上),因此那些简单的 HTML 链接不可能实现下载。也许您会担心用户在下载大文件期间会失去连接。

 
.Net给了我们很多的方式,以实现我们的不同下载需求.

★ 使用WriteFile下载小文件.

图1


  Button的代码:

    protected void btn_DownSmallFile_Click(object sender, EventArgs e)
    {
        string fileName = "1.html";
        Response.Clear();                                                                         //清除缓冲区如果不这么做,页面中的HTML会被认为是文件的一部分一起输出
        Response.ContentType = "application/octet-stream";           //用来设置输出流的类型
        Response.AddHeader("Content-Disposition","attachment;filename=" + fileName);   
//用于输出一些描述信息,告诉浏览器怎么操作.
              //attacherment代表下载,inline代表打开,在这里如果改为inline,1.html将会被直接打开,出现图2的情况
              //filename即是显示的文件名,在这里可以自己改名,例如改为:alwaysthere.rar,出现图3的情况
        Response.WriteFile(fileName);
        Response.End();
    }
图2

图3 


★ 使用BinaryWrite下载大文件
  引用:
先前代码示例所存在的文件大小问题源于对 Response.WriteFile 的单一调用,该调用将在内存中缓冲整个源文件。处理大文件的更有效方法就是将文件分成小的、易管理的文件块来读取并发送到客户端,如图4 中的示例所示。此版本的 Page_Load 事件处理程序每次使用 while 循环读取文件中的 10,000 个字节,然后将这些文件块发送给浏览器。因此,在运行时文件不会有任何重要部分保留在内存中。文件块大小目前被设为一个常量,但可通过编程方式对其修改,甚至也可以将其移动到配置文件中,以便根据服务器限制和性能要求对其进行更改。我使用一个大小高达 1.6GB 的文件测试了此代码,结果是下载速度非常块,并且不会耗用大量的服务器内存。

IIS 本身并不支持文件大小超出 2GB 的文件下载。如果您要下载较大的文件,则需要使用 FTP、第三方控件、Microsoft 后台智能传送服务 (BITS) 或一个自定义解决方案(例如,通过套接字将数据流式传送到托管浏览器的自定义控件)。

protected void btn_DownBigFileByBinaryWrite_Click(object sender, EventArgs e)
    {
        string fileName = "SQL server 2000 个人版 XP能用.rar";
        Response.Clear();
        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
        //从磁盘读去文件流
        System.IO.FileStream fs = System.IO.File.OpenRead(Server.MapPath(fileName));
        byte[] buffer = new byte[10000];
        int count = 0;
        while ((count = fs.Read(buffer, 0, buffer.Length)) > 0)
        {
            Response.BinaryWrite(buffer);
            Response.Flush();
        }
        fs.Close();
        Response.End();
    }

  
//使用这种方法,在某些时候传输速度是跟跟buffer的length成正比的.

★ 使用TransmitFile下载文件(.Net2.0)
     引用:

文件下载要求的共同性以及通常文件大小都在不断增加的这个事实促使 ASP.NET 开发团队在 ASP.NET 中添加了一个特定方法,以便在下载文件时,不必在内存中对文件进行缓冲处理就可以将其发送到浏览器。该方法就是 Response.TransmitFile,在 ASP.NET 2.0 中提供。

TransmitFile 的用法与 WriteFile 非常相似,但 TransmitFile 通常会产生更好的性能特征。TransmitFile 还可以与其他功能性相媲美。看一下图5 中的代码,此代码使用新增的 TransmitFile 的一些附加功能来避免上述的内存使用问题。

protected void btn_DownFileByTransmit_Click(object sender, EventArgs e)
    {
        string fileName = "SQL server 2000 个人版 XP能用.rar";
        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
        Response.TransmitFile(fileName);
  }

可以看到在.Net 2.0 里,大文件下载变得非常简单.

★ 恢复大文件下载 
    更新...

  • 相关文章:
  • quote 1.营销资料下载
  • http://www.vcaifu.com/down/class/list1_1.html
  • 文件下载要求的共同性以及通常文件大小都在不断增加的这个事实促使 ASP.NET 开发团队在 ASP.NET 中添加了一个特定方法,以便在下载文件时,不必在内存中对文件进行缓冲处理就可以将其发送到浏览器。该方法就是 Response.TransmitFile,在 ASP.NET 2.0 中提供。
  • 2008-9-2 11:18:16 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright www.alwaysthere.com.cn . Some Rights Reserved.

              

Powered By Z-Blog 1.8 Devo Build 80201