.NET 8 WebAPI文件下载包含断点续传和取消下载

server/2025/2/8 22:04:44/

一、文件下载(取消下载服务端不会知道)

	/// <summary>/// 文件下载/// </summary>/// <param name="FilePath">文件相对路径</param>/// <returns></returns>[HttpGet]public IActionResult DownloadFile([FromQuery] string FilePath){try{string filePath = GlobalConfig.Com.WebPath.UserResourcePath + FilePath;  //文件物理路径if (!System.IO.File.Exists(filePath)){LogHelper.Info($"客户端下载文件失败:文件不存在,文件绝对路径:{filePath}", LogHelper.GetCurSourceFileName(), LogHelper.GetLineNum());return new EmptyResult();}string fileName = Path.GetFileName(filePath);var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 4096, true);  //异步读取文件return File(fileStream, "application/octet-stream", fileName, true);  //为true时,支持断点续传}catch (Exception ex){LogHelper.Error("客户端下载文件出现异常:", ex, LogHelper.GetCurSourceFileName(), LogHelper.GetLineNum());return new EmptyResult();}}

二、.NET Core 写Response.Body下载(取消下载服务端知道)

	/// <summary>/// 文件中转下载/// </summary>/// <param name="FilePath">文件相对路径</param>/// <returns></returns>[HttpGet]public void DownloadFile1([FromQuery] string FilePath){try{string filePath = GlobalConfig.Com.WebPath.UserResourcePath + FilePath;  //文件物理路径if (!System.IO.File.Exists(filePath)){LogHelper.Info($"客户端下载文件失败:文件不存在,文件绝对路径:{filePath}", LogHelper.GetCurSourceFileName(), LogHelper.GetLineNum());return;}string fileName = Path.GetFileName(filePath);long beginPosition = 0;var fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 4096, true);//断点续传string rangeStr = Request.Headers["range"];  //range 参数格式:byte=1024-,这个是http协议的格式,也可以自定义格式if (!string.IsNullOrEmpty(rangeStr))  //断点续传{string byteStr = rangeStr.Split("=")?[1];if (!string.IsNullOrEmpty(byteStr)){var byteArr = byteStr.Split("-");if (byteArr != null && byteArr.Length > 1){beginPosition = Convert.ToInt64(byteArr[0]);}}}HttpContext.Response.ContentType = "application/octet-stream";HttpContext.Response.Headers.Append("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName));HttpContext.Response.Headers.Append("Charset", "utf-8");HttpContext.Response.Headers.Append("Access-Control-Expose-Headers", "Content-Disposition");int bufferSize = 1024;  //每次读取1MB到服务器内存using (HttpContext.Response.Body){long contentLength = fs.Length;HttpContext.Response.ContentLength = contentLength;byte[] buffer;long hasRead = 0;while (hasRead < contentLength){if (HttpContext.RequestAborted.IsCancellationRequested){//取消下载会进来,这里可以做一些操作。。。。。break;}fs.Seek(hasRead, SeekOrigin.Begin);buffer = new byte[bufferSize];//从下载文件中读取bufferSize(1024字节)大小的内容到服务器内存中int currentRead = fs.Read(buffer, 0, bufferSize);HttpContext.Response.Body.WriteAsync(buffer, 0, currentRead);HttpContext.Response.Body.Flush();hasRead += currentRead;}if (hasRead == contentLength)  //下载完成{//下载完成之后要做的事。。。。return;}}}catch (Exception ex){LogHelper.Error("客户端下载文件出现异常:", ex, LogHelper.GetCurSourceFileName(), LogHelper.GetLineNum());return;}}


http://www.ppmy.cn/server/166039.html

相关文章

物联网实训室解决方案(2025年最新版)

一、专业定位与人才培养体系 &#xff08;一&#xff09;专业战略定位 本专业聚焦物联网产业链关键环节&#xff0c;致力于培养适应未来智能时代需求的复合型技术人才。我们的培养目标是帮助学生掌握物联网全产业链核心技能&#xff0c;包括智能感知、网络通信、数据处理、系…

13.代理模式(Proxy Pattern)

定义 代理模式&#xff08;Proxy Pattern&#xff09; 是一种结构型设计模式&#xff0c;它通过提供一个代理对象来控制对目标对象的访问。代理对象作为客户端与目标对象之间的中介&#xff0c;间接地访问目标对象的功能。代理模式可以在不改变目标对象的情况下增加一些额外的…

【AI应用】免费的文本转语音工具:微软 Edge TTS 和 开源版 ChatTTS 对比

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 我试用了下Edge TTS&#xff0c;感觉还不错&#xff0c;不过它不支持克隆声音&#xff08;比如自己的声音&#xff09; 微软 Edge TTS 和 开源版 ChatTTS 都是免费的 文本转语音&…

3. 【.NET Aspire 从入门到实战】--理论入门与环境搭建--环境搭建

构建现代云原生应用程序时&#xff0c;开发环境的搭建至关重要。NET Aspire 作为一款专为云原生应用设计的开发框架&#xff0c;提供了一整套工具、模板和集成包&#xff0c;旨在简化分布式系统的构建和管理。开始项目初始化之前&#xff0c;确保开发环境的正确配置是成功的第一…

BUU21 [极客大挑战 2019]BuyFlag1

打开pay.php界面F12可以看见源代码 <!--~~~post money and password~~~ if (isset($_POST[password])) {$password $_POST[password];if (is_numeric($password)) {echo "password cant be number</br>";}elseif ($password 404) {echo "Password R…

Spring Web MVC项目的创建及使用

一、什么是Spring Web MVC&#xff1f; Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中&#xff0c;通常被称为Spring MVC。 1.1 MVC的定义 MVC 是 Model View Controller 的缩写&#xff0c;它是软件工程中的一种软件架构…

106,【6】 buuctf web [SUCTF 2019]CheckIn

进入靶场 文件上传 老规矩&#xff0c;桌面有啥传啥 过滤了<? 寻找不含<?的一句话木马 文件名 123(2).php.jpg 文件内容 GIF89a? <script language"php">eval($_GET[123]);</script> 123即密码&#xff0c;可凭借个人喜好更换 再上传一个文…

Linux在x86环境下制作ARM镜像包

在x86环境下制作ARM镜像包&#xff08;如qemu.docker&#xff09;&#xff0c;可以通过QEMU和Docker的结合来实现。以下是详细的步骤&#xff1a; 安装QEMU-user-static QEMU-user-static是一个静态编译的QEMU二进制文件&#xff0c;用于在非目标架构上运行目标架构的二进制文…