惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
Recent Announcements
Recent Announcements
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
J
Java Code Geeks
V
V2EX
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
博客园 - Franky
爱范儿
爱范儿
T
Tailwind CSS Blog
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
博客园_首页
B
Blog RSS Feed
博客园 - 司徒正美
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - 农村的芬芳

PHP使用第三篇:生成数据库 使用THINKPHP产生的:No database selected [问题 从今天开始记录PHP使用的点点滴滴 留给自个看的工具提示 转xml Oracle 跨库 查询 复制表数据 关于海量数据处理 近日用到啦progressbar控件,将其用法留一下 select into 和 insert into select 两种表复制语句 采用regsvr32注册组件后提示:没有注册 net2005中将list<>数组转换为Table 将对象数组转换成dataset windows 服务操作 转载:XML与DataSet的相互转换类 oracle 日期函数小计 如何创建自定义帐户来运行 ASP.NET 通过ASP.net程序创建域帐户故障 EnterpriseLibrary服务问题 超级郁闷之问题,请DUDU及各位大位指正错误
下载文件关闭窗体之解决方法
农村的芬芳 · 2006-10-25 · via 博客园 - 农村的芬芳

对于下载时新打开一窗口下载,下载完后需要关闭的
一种:对于较小文件可以有效:
System.IO.FileInfo file = new System.IO.FileInfo("F:\\mp3\\mp3\\别哭我最爱的人.mp3");
   Response.Clear();
   Response.ClearHeaders();
   Response.Buffer = false;
   Response.Charset="GB2312";
   Response.ContentEncoding=System.Text.Encoding.UTF8;
   Response.ContentType = "application/octet-stream";
   
   Response.AddHeader("Content-Disposition", "attachment; filename="+Server.UrlEncode("别哭我最爱的人.mp3"));
   Response.AddHeader("Content-Length", file.Length.ToString());

      

   Response.WriteFile(file.FullName);
   Response.Flush();
   Response.End();
该代码可以实现输出文件并将新打开的窗体关闭。

另一种对于大文件,我们用上述代码不是较好,因为上述代码是将文件全缓存于服务器后才输出的,如果你的服务器流量大,且文件较大,不建议用以上方法。

以下我测试过,较好能解决:
public static bool ResponseFile(HttpRequest _Request,HttpResponse _Response,string _fileName,string _fullPath, long _speed)
  {
   try
   {
    FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    BinaryReader br = new BinaryReader(myFile);
    try
    {
     _Response.AddHeader("Accept-Ranges", "bytes");
     _Response.Buffer = false;
     long fileLength = myFile.Length;
     long startBytes = 0;
    
     int pack = 10240; //10K bytes
     int sleep = (int)Math.Floor(1000 * pack / _speed) + 1;
     if (_Request.Headers["Range"] != null)
     {
      _Response.StatusCode = 206;
      string[] range = _Request.Headers["Range"].Split(new char[] {'=', '-'});
      startBytes = Convert.ToInt64(range[1]);
     }
     _Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
     if (startBytes != 0)
     {
      _Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
     }
     _Response.AddHeader("Connection", "Keep-Alive");
     _Response.ContentType = "application/octet-stream";
     _Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8) );
 
     br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
     int maxCount = (int) Math.Floor((fileLength - startBytes) / pack) + 1;

     for (int i = 0; i < maxCount; i++)
     {
      if (_Response.IsClientConnected)
      {
       _Response.BinaryWrite(br.ReadBytes(pack));
       Thread.Sleep(sleep);
      }
      else
      {
       i=maxCount;
      }
     }
     _Response.Flush();
    }
    catch
    {
     return false;
    }
    finally
    {
     br.Close();
     myFile.Close();
    }
   }
   catch
   {
    return false;
   }
   return true;
  }
这一种代码也是借签网上的
它也可以实现输出文件并关闭新打开幕窗体

另外在测试当中发现,服务器端与客户的操作系统不同
也会有一些意想不到的事情发生
一般来说,用以上代码,如不能正常关闭,你可以查阅浏览器的设置,在高级中。
再者,你可以修改不同的输出内容类型Response.ContentType = "application/octet-stream";因为不同的contenttype,在客户的端的解释可能是不一样的。
有想法请回复,欢迎讨论