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

断点下载帮助方法

时间:2023-10-19 14:00:14浏览次数:23  
标签:帮助 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;
     }
 }

标签:帮助,end,Headers,start,controller,断点,Response,下载,size
From: https://www.cnblogs.com/wml-it/p/17774543.html

相关文章

  • 经纬度帮助类
    核心代码///<summary>///点位信息///</summary>[DataContract]publicclassDPoint{///<summary>///x坐标,对应经度///</summary>publicdoublex;///<summary>///y坐标,对应纬度///</summary>publi......
  • js分片上传&断点续传
    原理js将大文件分成多分,全部上传成功之后,调用合并接口合成文件。如果传输中断,下次上传的时候过滤掉已经上传成功的分片,将剩余的分片上传,成功之后合并文件。前置条件获取uoloadId接口(用于标记分片)分片上传接口合成文件接口(后端自动合成则不需要)查询已上传的分片列表接口(断点......
  • js实现文件切片上传,断点续传
    断点续传:顾名思义,继续上次断开的点,继续上传。思路整理:拿到文件,对文件进行fingerprint=md5(file),得到文件指纹。将指纹保存服务器。切割文件,分段上传,每次上传一段。服务器根据指纹进行索引判断文件上传进度,直到文件的全部片段上传完毕。以下文字没有完整的代码,只有基础......
  • Adobe InDesign 2023 下载安装及永久激活教程!
    软件介绍:AdobeInDesign是Adobe公司的一个桌面出版(DTP)应用程序,主要用于各种印刷品的排版编辑。该软件是直接针对其竞争对手QuarkXPress而发布的。虽然最初在争取用户方面面临了一些困难,但在2002年发布了MacOSX版本后开始赶超其竞争对手。 安装和使用教程:1.通过文章末尾处下载......
  • javascript之分片上传,断点续传的实际项目实现详解
    首先,我们需要了解什么是分片上传和断点续传。分片上传是将大文件分成多个小块进行上传,每个小块可以独立上传,从而提高上传速度和稳定性。而断点续传是指在上传大文件时,当上传过程中因断网或其他原因中断,再次上传时可以不用重头开始,而是从中断的地方继续上传。接下来是分片上传和......
  • InCopy(Ic)2022软件下载 IC中文直装版下载 软件激活版
    AdobeInCopyCC2018官方中文版是一款优秀的创意写作编辑软件,由大名鼎鼎的Adobe公司所出品。该InCopyCC与AdobeInDesignCC紧密集合为作家,编辑,设计师等创意人员协同工作流。AdobeInCopyCC2018版本采用了更加现代的UI设计,增加了对HIDPI和Retina显示屏的支持;增强了字体搜索功......
  • ic下载安装下载-简体中文版-正版下载 软件激活版
    AdobeInCopy2023作为一款音频制作剪辑软件,Audition2021具备非常强大的功能,可以满足音频工作者在各种制作场景下的需求。这款软件在界面设计和用户体验方面也做了很多优化,让用户可以更加方便快捷地进行各种操作。其中,波形编辑器中的插入模式和关键帧拖动功能的优化,无疑是Audition......
  • InCopy(Ic)软件包下载 文字编辑软件InCopy 软件激活版
    AdobeInCopy是一款功能强大的文字编辑和校对工具,为印刷出版、编辑和排版团队提供了高效的协作环境。通过使用InCopy,用户可以进行文字编辑、校对和格式设置,并与设计师无缝配合,实现高质量的印刷品和出版物。无论是杂志、报纸、书籍还是电子出版物,InCopy都为编辑人员提供了必备的功能......
  • dreamweaver下载-dreamweaver最新版 软件激活版
    AdobeDreamweaver官方简介AdobeDreamweaver,简称“DW”,中文名称"梦想编织者",最初为美国MACROMEDIA公司开发,2005年被Adobe公司收购。Macromedia,Inc(纳斯达克:MACR),成立于1992年,2005年被Adobe公司收购。在全球信息产业迅猛发展的今天,Macromedia公司把发展的重点转向以中国大陆地......
  • Dreamweaver 2021 下载及安装教程 DW下载 软件激活版
    DreamweaverCC2017中文版简称为“DW”,它是由国外知名公司Adobe开发的一个集网页制作和管理网站于一身的所见即所得网页代码编辑器。拥有实时检查和CSS设计工具等多项增强功能,可以帮助用户更加轻松地创建和更新桌面平台和移动设备的网页内容,另外,它强大的快速检查功能可以帮助网页设......