榕树下。。。

在成功的道路上,你没有耐心去等待成功的到来,那么,你只好用一生的耐心去面对失败
posts - 34, comments - 17, trackbacks - 0, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

对于下载时新打开一窗口下载,下载完后需要关闭的
一种:对于较小文件可以有效:
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,在客户的端的解释可能是不一样的。
有想法请回复,欢迎讨论

Feedback

#1楼[楼主]   回复  引用  查看    

2006-10-26 10:13 by 农村的芬芳      
另:经测试
在不同的操作系统中,效果不太一样
在用上述代码时,不能打开新页,最好在本页跳转,能较好的实现关闭页

还有一想法,就是想实现
打开新页也能正常关闭的方法。有想法与成熟的实验者请告诉一下。
也就是说我打开一新页,当一弹出保存框后它会自动关闭,哪就好啦

#2楼   回复  引用    

2006-10-30 11:09 by 闪电侠[未注册用户]
如何实现啊,我现在也遇到这样的问题,但不知如何解决,高手帮忙啊?
毕竟上面的代码是放到新页里面去实现的

#3楼[楼主]   回复  引用  查看    

2006-11-03 17:09 by 农村的芬芳      
楼上,
上面的代码是放在新的窗体中,
例:
A页面有个下载按钮
链接的是B页面

点击A页面下载按钮,我的意思是你不要在新窗口中打开B页,要在本窗体中跳转,这样是可以的,但要是新弹出另一个窗体,哪是有一定难困的,有的人说定义一个角本函数,来定时关闭,哪肯定是会有问题的,不是解决方法

#4楼   回复  引用    

2008-07-29 17:11 by adolfgzb[未注册用户]
恩, 我也验证了系统不同的时候,现象会不一样的。
XP系统是可以正常关掉的。

其实还有个疑问的,为什么点了“打开(Open)”和取消 都可以正常关掉,仅仅保存不能关掉呢??

这中间不知道有什么事件不同呢??

不知道呢。。。

#5楼   回复  引用    

2008-07-29 17:37 by adolfgzb[未注册用户]
在主页面 使用本页跳转到子页面,可以的。
但是跳转倒子页面之后,主页面已经没有办法进行操作了。

#6楼   回复  引用  查看    

2009-03-23 14:57 by DataFlow      
可以动态创建一个iframe,并将其src值置为down file Url.



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 539257




相关文章:

相关链接: