Asp.net(c#)实现多线程断点续传下载大文件

/// <summary>
        /// 下载的方法
        /// </summary>
        /// <param name="filepath">下载文件的路径</param>

       public void Reget(string filepath)
        {
            System.IO.Stream iStream = null;

            // 分块读取,每块10K bytes 
            byte[] buffer = new Byte[10240];

            //文件的大小
            int length;

            // 文件的字节数
            long dataToRead;

           // 得到文件名
            string filename = System.IO.Path.GetFileName(filepath);

            try
            {
                Response.Clear();
                Response.ClearHeaders();
                //打开文件
                iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
                    System.IO.FileAccess.Read, System.IO.FileShare.Read);

                // 总字节
                dataToRead = iStream.Length;

                long p = 0;
                if (Request.Headers["Range"] != null)
                {
                    //如果是续传请求,则获取续传的起始位置,即已经下载到客户端的字节数
                    Response.StatusCode = 206; //重要:续传必须,表示局部范围响应。
                    p = long.Parse(Request.Headers["Range"].Replace("bytes=", "").Replace("-", ""));
                }
                if (p != 0)
                {
                    //不是从最开始下载,
                    //响应的格式是:Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
                    Response.AddHeader("Content-Range", "bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
                }
                Response.AddHeader("Connection", "Keep-Alive");
                Response.AddHeader("Content-Length", ((long)(dataToRead - p)).ToString());
                Response.ContentType = "application/octet-stream";   //MIME类型:匹配任意文件类型 
                Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename)));

                iStream.Position = p;
                dataToRead = dataToRead - p;
                // 读字节
                while (dataToRead > 0)
                {
                    //确认客户端连接
                    if (Response.IsClientConnected)
                    {
                        // Read the data in buffer.
                        length = iStream.Read(buffer, 0, 10240);

                        // 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[10240];
                        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)
                {
                    //关闭流
                    iStream.Close();
                }
                Response.End();
            }
        }

对于这个方法,我做过测试,不过太大的文件(大于1G)下载就出现问题,各位要是有什么办法可以解决或有什么更好的方法的话可以写下。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值