c#使用HttpResponseMessage创建webapi下载大文件接口
时间: 2024-10-22 20:13:44 浏览: 26
在 C# 中创建一个 Web API 接口来供用户下载大文件通常会涉及分块传输以及使用 `HttpResponseMessage` 和相关的流处理技术。以下是创建这样一个下载接口的一个基本示例:
```csharp
using System.Net;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
public class FileController : ControllerBase
{
[HttpGet("Download/{filename}")]
public async Task<IActionResult> DownloadFile(string filename)
{
try
{
// 假设文件存储在一个公共文件目录下
string filePath = $"~/Files/{filename}";
// 检查文件是否存在
if (!System.IO.File.Exists(filePath))
{
return NotFound($"File '{filename}' not found.");
}
// 创建HttpResponseMessage实例并设置Content-Disposition头信息
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
response.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = filename
};
// 设置响应的内容类型
response.ContentType = "application/octet-stream";
// 使用FileStream读取文件内容,并分块传输
using (FileStream fileStream = System.IO.File.OpenRead(filePath))
{
int bufferSize = 4096; // 分块大小,可根据需要调整
byte[] buffer = new byte[bufferSize];
long bytesRead;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
await response.Body.WriteAsync(buffer, 0, bytesRead);
}
}
return response;
}
catch (Exception ex)
{
return StatusCode((int)HttpStatusCode.InternalServerError, ex.Message);
}
}
}
```
在这个示例中,当客户端请求 `/Download/{filename}` 时,API 将检查文件是否存在,然后通过 `CreateResponse` 方法创建一个 `HttpResponseMessage` 并设置适当的内容类型、Content-Disposition。接着,它打开文件流,按缓冲区大小分块读取文件内容,并逐步写入到响应体中。
阅读全文