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

embedded/2025/2/12 0:41:55/

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

	/// <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/embedded/161153.html

相关文章

使用 TensorRT 和 Python 实现高性能图像推理服务器

在现代深度学习和计算机视觉应用中&#xff0c;高性能推理是关键。本文将介绍如何使用 TensorRT 和 Python 构建一个高性能的图像推理服务器。该服务器能够接收客户端发送的图像数据&#xff0c;使用 TensorRT 进行推理&#xff0c;并将结果返回给客户端。 1. 概述 1.1 项目目…

初步了解OpenCV

1.1. 基本概念 计算机视觉库&#xff1a; OpenCV 是一个专门用于计算机视觉任务的库&#xff0c;它可以处理图像&#xff08;如图片、视频帧&#xff09;和视频流&#xff0c;执行各种复杂的视觉处理操作。它支持跨平台运行&#xff0c;可以在 Windows、Linux、MacOS、Android…

Visual Basic语言的图形用户界面

Visual Basic语言的图形用户界面 引言 在程序开发的世界中&#xff0c;图形用户界面&#xff08;Graphical User Interface&#xff0c;简称GUI&#xff09;是连接用户与计算机程序的重要桥梁。通过GUI&#xff0c;用户可以更加直观和方便地与程序互动&#xff0c;实现各种功…

在 Linux 系统下,解压 `.tar.gz`

在 Linux 系统下,解压 .tar.gz 文件通常使用 tar 命令。.tar.gz 文件是一种压缩归档文件,它首先使用 tar 命令将多个文件打包为一个 .tar 文件,然后再使用 gzip 压缩生成 .tar.gz 文件。 解压 .tar.gz 文件的命令 要解压 .tar.gz 文件,可以使用以下命令: tar -xzvf fil…

GWO优化高斯回归预测matlab

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;简称 GWO&#xff09;&#xff0c;是一种群智能优化算法&#xff0c;由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出。该算法的设计灵感源自灰狼群体的捕食行为&#xff0c;其核心思想是模仿灰狼社会的结构与行…

2、k8s的cni网络插件和基本操作命令

kube-prxoy属于节点组件&#xff0c;网络代理&#xff0c;实现服务的自动发现和负载均衡。 k8s的内部网络模式 1、pod内的容器于容器之间的通信。 2、一个节点上的pod之间的通信&#xff0c;docker0网桥直接通信。 3、不同节点上的pod之间的通信&#xff1a; 通过物理网卡的…

CVPR | CNN融合注意力机制,芜湖起飞!

**标题&#xff1a;**On the Integration of Self-Attention and Convolution **论文链接&#xff1a;**https://arxiv.org/pdf/2111.14556 **代码链接&#xff1a;**https://github.com/LeapLabTHU/ACmix 创新点 1. 揭示卷积和自注意力的内在联系 文章通过重新分解卷积和自…

springboot基于微信小程序的仓储管理系统

大家好&#xff0c;我是2013crazy&#xff0c;今天为大家带来的是Java 基于 SpringBootVue 的校园兼职平台。Java 项目的安装部署教程&#xff0c;包括软件的下载&#xff0c;软件的安装。该系统采用 Java 语言开发&#xff0c;SpringBoot 框架&#xff0c;MySql 作为数据库&am…