代码

public static void DownloadFile(HttpContext context, string filePath)
{
UtilLite.Guard<ArgumentNullException>(context == null);
FileInfo file = new FileInfo(filePath);
UtilLite.Guard<FileNotFoundException>(!file.Exists);
context.Response.Clear();
context.Response.Buffer = false;
context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(Encoding.UTF8.GetBytes(file.Name)));
context.Response.AppendHeader("Content-Length", file.Length.ToString());
context.Response.ContentType = "application/octet-stream";
context.Response.WriteFile(filePath);
context.Response.Flush();
context.Response.End();
}

public static void Range(HttpContext context, string filePath)
{
UtilLite.Guard<ArgumentNullException>(context == null);
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
Response.Clear();
Response.Buffer = false;
Response.AddHeader("Accept-Ranges", "bytes");
int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize))
{
long p = 0L, l = stream.Length;
#region Resolve Range
string range = Request.Headers["Range"];
if (range != null)
{
//Range:bytes=1024-
//Range:bytes=1024-2048
//Range:bytes=-1024
//Range:bytes=0-512,1024-2048
int index = range.IndexOf("=");
if (index != -1)
{
string[] ranges = range.Substring(index + 1).Split(',');
if (ranges.Length > 1)
{
//not supported multipart/byterange
}
else
{
bool flag = false;
if (ranges[0].StartsWith("-"))
{
long _p, _absp;
if (long.TryParse(ranges[0], out _p) && (_absp = Math.Abs(_p)) <= l)
{
if (_p < 0)
{
p = l - _absp;
l = _absp;
flag = true;
}
}
}
else
{
ranges = ranges[0].Split('-');
if (ranges.Length == 2)
{
long _p, _l;
if (ranges[1] == string.Empty)
{
if (long.TryParse(ranges[0], out _p) && _p <= l)
{
p = _p;
flag = true;
}
}
else if (long.TryParse(ranges[0], out _p) && long.TryParse(ranges[1], out _l) && _p > 0 && _l > 0 && _p < _l && _l < l)
{
p = _p;
l = _l + 1;
flag = true;
}
}
}
if (flag)
{
Response.StatusCode = 206;
Response.AddHeader("Content-Range", "bytes " + p.ToString() + "-" + l.ToString() + "/" + stream.Length.ToString());
}
else
{
Response.StatusCode = 416; //Requested range not satisfiable
}
}
}
}
#endregion
Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(Encoding.UTF8.GetBytes(Path.GetFileName(filePath))));
Response.AddHeader("Content-Length", l.ToString());
Response.ContentType = "application/octet-stream";
stream.Position = p;
int read;
while (Response.IsClientConnected && p < l)
{
Response.OutputStream.Write(buffer, 0, read = stream.Read(buffer, 0, bufferSize));
Response.Flush();
p += read;
}
}
Response.End();
}

转载于:https://www.cnblogs.com/Googler/archive/2010/08/19/1803809.html

Asp.Net 分段,断点,下载相关推荐

  1. 带进度条的ASP无组件断点续传下载代码

    <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%Option Explicit%> <% '= ...

  2. SpringBoot+Vue 实现大文件断点下载

    目录 效果 代码 SpringBoot Vue 效果 步骤 点击下载 在输入框输入下载的文件名称 点击暂停 再次点击开始 下载完成 代码 SpringBoot pom <!-- 做断点下载使用- ...

  3. Android 多线程断点下载demo实现

    先来一张效果图: 主要实现思路: 每一个下载都是通过RandomAccessFile对下载资源的总长进行切割之后,根据我们设置的线程多少进行计算之后开启多线程下载的.而每一个任务都是一个AsyncTa ...

  4. 高并发多线程分片断点下载

    基于Java的高并发多线程分片断点下载 首先直接看测试情况: 单线程下载72MB文件 7线程并发分片下载72MB文件: 下载效率提高2-3倍,当然以上测试结果还和设备CPU核心数.网络带宽息息相关. ...

  5. iOS网络-NSURLSessionDataTask大文件离线断点下载

    什么叫离线断点下载,就是用户下载中关闭程序重新打开可以继续下载 代码实现如下: #import "ViewController.h" @interface ViewControll ...

  6. libcurl断点下载遇到的问题

    最近游戏把资源(图片.配置.lua)的加载.更新全部改了 ,加载其实还好,就是不走之前的zip解压方式. 以前的大体流程: 下载 –> 启动 –> 解压 –> 更新 –> 进入 ...

  7. 使用NSURLConnection实现大文件断点下载

    使用NSURLConnection实现大文件断点下载 由于是实现大文件的断点下载,不是下载一般图片什么的.在设计这个类的时候本身就不会考虑把下载的文件缓存到内存中,而是直接写到文件系统. 要实现断点下 ...

  8. Android多线程断点下载

    到华为后,信息管理特别严格,文件不能外发.所以好久都没写博客了,今天周日,老婆非要我学习.就闲来无事,写一篇博客,呵呵-- 前段时间,项目中提到了断点下载apk并静默安装的需求.本打算用应用市场成熟的 ...

  9. iOS开发网络篇—多线程断点下载

    iOS开发网络篇-多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...

  10. 一行代码快速搞定Flowable断点下载(下)

    一行代码快速搞定Flowable断点下载(下) 其实这个主题对应的三篇文章真的真的非常难写,首先是感觉非常多人对于函数式编程不太熟悉,然后又有一些人对于kotlin不太熟悉.这就导致了,写这三篇文章的 ...

最新文章

  1. cuDNN 功能模块解析
  2. 2021年高考模拟考成绩查询,2021年湖北省普通高考模拟考试成绩查询
  3. 表操作,数据操作,单表查询,python操作数据库
  4. Android studio导出的apk在真机上安装提示“文件不存在或已失效”的解决方法
  5. c语言中如何让诊断代码右移_如何检测和诊断生产中的慢代码
  6. (算法)宝石升级问题
  7. 解析 react、vue等路由参数的库 path-to-regexp
  8. Java——集合经典面试题
  9. NG2入门 - 架构
  10. mysql allowed packet_修改mysql的max_allowed_packet值
  11. Python 根据图片url,批量下载图片
  12. SQL Server 2008查询IP地址方法
  13. Android 10去除电池图标以及设置
  14. C++用*和空格输出一个正方形及其对角线
  15. MySQL 连接挂死了!该如何排查?
  16. Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理
  17. 深度学习21_李宏毅_02_Regression_P2
  18. 数字签名(1) 证书下载
  19. CTF_Misc_【BUUCTF】 杂项——二维码Code
  20. QA-GNN: Reasoning with Language Models and Knowledge Graphsfor Question Answering

热门文章

  1. 静态路由实验配置举例
  2. php_mvc实现步骤五
  3. 全球唯一标识符:GUID在线生成
  4. Flink – window operator
  5. Js里面IF(var)表示什么意思?js中if的写法、含义
  6. jQuery 2.0.3 源码分析Sizzle引擎 - 解析原理
  7. 卸载linux下的mysql数据库实例_Linux下卸载MySQL数据库实例教程
  8. mysql5.5表的创建源码_mysql5.5 源码安装
  9. python多行注释符号_python知识学习,python标识符和关键字
  10. java之上三角矩阵_7-1 判断上三角矩阵