zoukankan      html  css  js  c++  java
  • ASP.NET实现文件断点续传

    在文件下载的时候,使用断点续传可以将上次未下载完成的文件继续下载,该功能在开发文件下载的时候非常重要。这里我将介绍一种比较简单的断点续传功能的实现方法,仅供初学者参考使用。各位大神级别的可以略过。。。
    这里我通过Response类中的AddHeader方法将一个HTTP头添加到输出流中。在HTTP头中,是由头信息和体信息组成。两者之间用一行空行分开。这里利用在头中加入Range段,来表示客户端希望从何处继续下载,来实现续传功能。
    好了废话不多说,让我们开始吧。
    1.新建1个主页,名字随便起哈。
    2.在该页中添加1个LinkButton按钮,该按钮用来执行实现的过程。
    3.在LinkButton的Click事件中,实现断点续传功能。
    代码如下:
    另外不要忘记引用System.IO命名空间,这里只贴出后台实现代码了(前台不会可以回去从学了。。。)

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.IO;
    public partial class DFile : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
        protected void LinBtnDFile_Click(object sender, EventArgs e)
        {
            // 创建一比特数组
            byte[] buffer = new Byte[10240];
            // 指定要下载文件的路径.
            string filePath = @"D:\爱智旮旯.rar";
    
            // 或取文件名包括扩展名
            string fileName = Path.GetFileName(filePath);
            Stream fileStream = null;
            try
            {
                // 打开文件
                fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
                Response.Clear();
    
                // 获取文件的大小
                long fileSize = fileStream.Length;
    
                long sum = 0;
                if (Request.Headers["Range"] != null)
                {
                    Response.StatusCode = 206; // 表示返回到客户端的 HTTP 输出状态的整数。默认值为 200。
                    sum = long.Parse(Request.Headers["Range"].Replace("bytes=", "").Replace("-", ""));
                }
                if (sum != 0)
                {
                    Response.AddHeader("Content-Range", "bytes " + sum.ToString() + "-" + ((long)(fileSize)).ToString() + "/" + fileSize.ToString());
                }
                // 获取部分http头信息
                Response.AddHeader("Content-Length", ((long)(fileSize - sum)).ToString());
                Response.ContentType = "application/octet-stream";
                //获取文件来源
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(fileName)));
                // Response.Flush();
                fileStream.Position = sum;    //设置当前流位置
                fileSize = fileSize - sum;
                // 当文件大小大于0是进入循环
                while (fileSize > 0)
                {
                    // 判断客户端是否仍连接在服务器
                    if (Response.IsClientConnected)
                    {
                        // 获取缓冲区中的总字节数.
                        int length = fileStream.Read(buffer, 0, 10240);
    
                        // 写入数据
                        Response.OutputStream.Write(buffer, 0, length);
    
                        // 将缓冲区的输出发送到客户端
                        Response.Flush();
    
                        buffer = new Byte[10240];
                        fileSize = fileSize - length;
                    }
                    else
                    {
                        //当用户断开后退出循环
                        fileSize = -1;
                    }
                }
            }
            catch (Exception ex)
            {
                Response.Write("Error : " + ex.Message);
            }
            finally
            {
                if (fileStream != null)
                {
                    //关闭文件 
                    fileStream.Close();
                }
                Response.End();
            }
        }
    }

    这里比较简单,请根据实际情况作适当修改。

  • 相关阅读:
    ajax理论
    模块
    node.js(1)
    ES6
    data对象
    数组
    对象
    webdriver对应的驱动版本
    TrineaAndroidCommon API Guide
    PV,UV,IP概念
  • 原文地址:https://www.cnblogs.com/52net/p/2537168.html
Copyright © 2011-2022 走看看