C# WEB API ApiController 修改response header contentType

var res = Request.CreateResponse(HttpStatusCode.OK, file);
res.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html"); ;
return res;

转载于:https://www.cnblogs.com/niaowo/p/3732722.html

在.NET 4.5框架下,你可以创建一个Web API服务来处理大文件的下载。这里是一个简单的示例,展示如何设计一个支持分块下载的API接口: ```csharp using System; using System.IO; using System.Threading.Tasks; using System.Web.Http; namespace YourNamespace.Controllers { public class DownloadController : ApiController { [HttpGet] public async Task<HttpResponseMessage> DownloadLargeFile(string fileId) { if (string.IsNullOrEmpty(fileId)) return Request.CreateResponse(HttpStatusCode.BadRequest, "Invalid file ID"); // 假设你有一个存储大文件的数据库或文件系统 string filePath = GetFilePathFromDatabase(fileId); if (!System.IO.File.Exists(filePath)) return Request.CreateResponse(HttpStatusCode.NotFound, "File not found"); var contentLength = new FileInfo(filePath).Length; var response = Request.CreateResponse(HttpStatusCode.OK); response.Content.Headers.ContentLength = contentLength; // 使用FileStreamResult或StreamContent进行流式传输 using (var fileStream = File.OpenRead(filePath)) { response.Content = new StreamContent(fileStream); response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = Path.GetFileName(filePath) }; // 为了支持断点续传,可以设置Range头来获取部分数据 if (Request.Headers.Range != null) { await HandlePartialDownload(fileStream, contentLength, response); } else { await response.Content.ReadAsStreamAsync(); } return response; } } private async Task HandlePartialDownload(Stream fileStream, long totalSize, HttpResponseMessage response) { // Parse Range header and seek to the appropriate position byte[] rangeStartBytes = Convert.ToInt64(response.Headers.RequestRange.Start, 10).ToByteArray(); long startByte = BitConverter.ToInt64(rangeStartBytes, 0); // Check for valid range and adjust end byte accordingly long endByte; if (rangeStartBytes.Length == 8 && !response.Headers.RequestRange.HasRangeEnd) { endByte = totalSize - 1; } else { byte[] rangeEndBytes = Convert.ToInt64(response.Headers.RequestRange.End.ToString(), 10).ToByteArray(); endByte = Math.Min(BitConverter.ToInt64(rangeEndBytes, 0), totalSize - 1); } // Seek to the starting position and send only requested data fileStream.Seek(startByte, SeekOrigin.Begin); response.Content.Headers.ContentRange = new ContentRangeHeaderValue(startByte + 1, endByte, totalSize); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length)) > 0) { await response.Content.WriteAsync(buffer, 0, bytesRead); } } } } ``` 这个`DownloadLargeFile`方法首先验证请求的文件ID,然后读取文件并设置响应头。如果请求包含Range头,它将处理断点续传。注意,这只是一个基本示例,实际生产环境中可能需要考虑错误处理、文件版本控制、并发访问限制等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值