zoukankan      html  css  js  c++  java
  • 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现! 转

    使用该 URL  http://localhost/WebApplicationX/WebForm1.aspx  在 Flashget 中下载

    切换 暂停/开始 , 并增加下载的块数 测试!

    原理参见上一篇 blog JSP/Servlet 实现版: 

    http://blog.csdn.net/playyuer/archive/2004/07/30/56538.aspx

    利用该原理不难实现支持数据库大字段的断点续传多线程链接的下载!

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;

    public class WebForm1 : System.Web.UI.Page
    {
     private void Page_Load(object sender, System.EventArgs e)
     {

      string s  = @"e:\northwind.mdb";
      s = @"I:\\SetupRes\\Sun\\j2re-1_4_2_05-windows-i586-p.exe";
      System.IO.Stream S = new System.IO.FileStream(s, System.IO.FileMode.Open, System.IO.FileAccess.Read,System.IO.FileShare.Read);

      long p = 0;

      long l = new System.IO.FileInfo(s).Length;

     Response.AddHeader("Accept-Ranges","bytes");

      if (Request.Headers["Range"] != null)
      {
       Response.StatusCode = 206;
       //p = long.Parse( Request.Headers["Range"].Replace("bytes=","").Replace("-",""));
       //此处修改未征得原作者同意,还请见谅!(源自宝玉的建议)
       string range = Request.Headers["Range"];
       range = range.Replace("bytes=","");
       p = long.Parse( range.Substring(0, range.IndexOf("-"))); 
      }

      Response.AddHeader("Content-Length", ((long)(l - p)).ToString()  );

      if (p != 0)
      {
       //不是从最开始下载,
       //响应的格式是:
       //Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
       Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(l - p)).ToString() + "/" + l.ToString());
      }

      Response.ContentType = "application/octet-stream";    
      Response.AddHeader("Content-Disposition", "attachment; filename="  +  System.IO.Path.GetFileName(s));

      S.Position = p;

      int i = 1;
      byte[] b = new Byte[1024];
      while (i > 0)
      {
       i = S.Read(b, 0, b.Length);
       Response.OutputStream.Write(b, 0, i);
      }

      S.Close();
      Response.End();
     }
     #region Web 窗体设计器生成的代码
     override protected void OnInit(EventArgs e)
     {
      //
      // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
      //
      InitializeComponent();
      base.OnInit(e);
     }
      
     ///


     /// 设计器支持所需的方法 - 不要使用代码编辑器修改
     /// 此方法的内容。
     ///
     private void InitializeComponent()
     {
      this.Load += new System.EventHandler(this.Page_Load);
     }
     #endregion
    }



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=58430

  • 相关阅读:
    [轉]javascript 的 location 各種用法
    [轉]PHP命名空间规则解析及高级功能
    [轉]虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器
    [轉]深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数
    [連接]JavaScript中链式调用之研习
    [轉]安装SQL SERVER 2008时,提示:服务SQLBrowser启动请求失败
    AS支除兩邊的空格
    [轉]详解UML六大关系(依赖、类属(继承)、关联、实现、聚合和组合)
    [轉]jQuery UI 关闭父窗口打开的Dialog
    [轉]让PHP支持像jQuery那样的链式操作
  • 原文地址:https://www.cnblogs.com/wpwen/p/371948.html
Copyright © 2011-2022 走看看