首页 > 其他分享 >断点下载帮助方法

断点下载帮助方法

时间:2023-10-28 10:02:22浏览次数:46  
标签:帮助 end Headers start controller 断点 Response 下载 size

核心代码
public static class DownloadHelper
 {
     /// <summary>
     /// 断点下载
     /// </summary>
     /// <param name="controller"></param>
     /// <param name="fullpath"></param>
     /// <returns></returns>
     public static async Task<long> RangeDownload(this Controller controller, string fullpath,string filename)
     {
         long size, start, end, length, fp = 0;
         using (StreamReader reader = new StreamReader(File.OpenRead(fullpath)))
         {

             size = reader.BaseStream.Length;
             start = 0;
             end = size - 1;
             length = size;
          
             controller.Response.Headers.Add("Accept-Ranges", "0-" + size);

             if (!String.IsNullOrEmpty(controller.Request.Headers["Range"]))
             {
                 long anotherStart = start;
                 long anotherEnd = end;
                 string[] arr_split = controller.Request.Headers["Range"].FirstOrDefault().Split(new char[] { Convert.ToChar("=") });
                 string range = arr_split[1];

                 if (range.IndexOf(",") > -1)
                 {
                     controller.Response.Headers.Add("Content-Range", "bytes " + start + "-" + end + "/" + size);
                     controller.Response.StatusCode = 416;
                 }

                 if (range.StartsWith("-"))
                 {
                     anotherStart = size - Convert.ToInt64(range.Substring(1));
                 }
                 else
                 {
                     arr_split = range.Split(new char[] { Convert.ToChar("-") });
                     anotherStart = Convert.ToInt64(arr_split[0]);
                     long temp = 0;
                     anotherEnd = (arr_split.Length > 1 && Int64.TryParse(arr_split[1].ToString(), out temp)) ? Convert.ToInt64(arr_split[1]) : size;
                 }

                 anotherEnd = (anotherEnd > end) ? end : anotherEnd;
                 if (anotherStart > anotherEnd || anotherStart > size - 1 || anotherEnd >= size)
                 {

                     controller.Response.Headers.Add("Content-Range", "bytes " + start + "-" + end + "/" + size);
                     controller.Response.StatusCode = 416;
                     await controller.Response.WriteAsync("Requested Range Not Satisfiable");
                 }
                 start = anotherStart;
                 end = anotherEnd;

                 length = end - start + 1;
                 fp = reader.BaseStream.Seek(start, SeekOrigin.Begin);
                 controller.Response.StatusCode = 206;
             }
         }
         // Notify the client the byte range we‘ll be outputting
         controller.Response.Headers.Add("Content-Range", "bytes " + start + "-" + end + "/" + size);
         controller.Response.Headers.Add("Content-Length", length.ToString());
         controller.Response.Headers.Add("Content-Disposition", $"attachment; filename={filename}") ;
         // Start buffered download
         await controller.Response.SendFileAsync(fullpath, fp, length);
         return fp;
     }
 }

技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!

开源库地址,欢迎点亮:

GitHub: https://github.com/ITMingliang

Gitee:  https://gitee.com/mingliang_it

GitLab:  https://gitlab.com/ITMingliang

建群声明: 本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,为大家答疑解惑。热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!进群方式:扫码关注公众号,后台回复【进群

断点下载帮助方法_断点下载


标签:帮助,end,Headers,start,controller,断点,Response,下载,size
From: https://blog.51cto.com/u_16244728/8067164

相关文章

  • 前端大文件断点续传
    昨天整理了前端实现大文件上传通过文件切片进行处理,今天继续拓展进行断点续传原理断点续传的原理在于前端/服务端需要记住已上传的切片,这样下次上传就可以跳过之前已上传的部分,有两种方案实现记忆的功能前端使用localStorage记录已上传的切片hash服务端保存已上传的切片hash......
  • 如何下载AOSP的单个仓库
    AOSP使用repo来组织代码的,有时候我们只需要下载其中一部分代码。下面是具体的操作方式<?xmlversion="1.0"encoding="UTF-8"?><manifest><remotename="aosp"fetch=".."review="https://android-review.googleso......
  • Adobe_Photoshop_2024_25.0.0.37图文安装教程及下载
    Adobe_Photoshop_2024正式版,拥有之前beta版本的全部功能,包括但不限于内置AI绘图,一键抠图、移除工具、悬浮工具栏、图像扩展、填充式生成、调整预设等等。尤其是“生成式填充”和“生成式扩展”。除此之外,PS2024正式版还内置了NeuralFilters神经AI滤镜,这款插件用于图片的处理,它......
  • e4a开发的一款银行转账截图生成器,提供源码下载
    这个APP其实没什么意义,就是为了装逼和娱乐使用,但是这个只有一个功能就是能生成虚拟的转账截图,这个图你还能通过自己手机的截图功能去截图,保证电量和时间的实时性,软件生成的图片是固定的图片模版,提前用PS文件改好了Logo和图标信息,然后在加入到软件,设置编辑框内容启动对应的世间改变......
  • 记一次任意文件下载到Getshell
    任意文件下载(ArbitraryFileDownload)是一种常见的Web攻击技术,用于窃取服务器上任意文件的内容。攻击者利用应用程序中的漏洞,通过构造恶意请求,使应用程序将任意文件(如配置文件、敏感数据等)发送给攻击者。一旦攻击者成功利用这种漏洞,就可以从服务器上获取应用程序所拥有的任意文......
  • python 某音文件下载
    importtime#frompyqueryimportPyQueryaspqimportcommonMethodimportdatetimeimportrequestsimportreimportosimportjsonpattern_1='<sourceclass=""src="//v3-web.douyinvod.com/(.{486,488})type="">'......
  • MT管理器逆向改仿真银行app软件,提供教程和成品下载
    我这边的思路是通过MT管理器去逆向一个银行仿真APP,让里面的默认信息都自定义修改成我自己的,大佬可以不用看,但是一些新手有必要去学习一下。教程开始:1、需要的两个附件工具已经导入到了模拟器里面了2、用Mt管理器提取这个模拟器的安装包3、点查看,进入压缩包目录里4、然后点......
  • wpf webview2动态修改下载文件的下载路径 文件下载路径选择
    通过webview2下载文件时候会将文件保存在用户的默认下载目录,如果想调整成通过弹窗选择下载路径的方式则需要将默认行为做出修改。本文通过CoreWebView2_DownloadStarting这个事件来调整下载路径,基本思路为通过弹窗让用户选择需要保存的路径,如果用户取消了此操作则通过这个事件......
  • 大文件如何做断点续传?
    大文件如何做断点续传?上传大文件时,以下几个变量会影响我们的用户体验服务器处理数据的能力请求超时网络波动上传时间会变长,高频次文件上传失败,失败后又需要重新上传等等为了解决上述问题,我们需要对大文件上传单独处理1、分片上传分片上传,就是将所要上传的文件,按照一定的大小,将......
  • 大文件断点续传、快传秒传实现方案
    前言为什么视频、音频、大型文档等大文件不能也直接上传吗,简单又方便?遇到手动暂停、网络中断、网络不稳定或者服务端响应超时,当你终于半天到99%,网络突然断开喜提从0%再来一次再者一次服务接受如此大的数据传输,不说服务器肯同意接收,即使配置同意接受这常常会使服务器出现响应超时或......