📜  Web API - 将大文件流式传输到客户端 - C# (1)

📅  最后修改于: 2023-12-03 15:35:39.957000             🧑  作者: Mango

Web API - 将大文件流式传输到客户端 - C#

在Web API中,传输大文件是一项常见需求,因为传统的文件传输方式会导致内存和性能问题。流式传输大文件可以解决这个问题。

准备工作

在介绍流式传输大文件之前,我们需要准备一个大文件,该文件的大小应至少为几十兆甚至上百兆。这里我们以一个大小为100MB的图片文件为例。

传统文件传输方式

以往我们可能会使用以下方式传输文件:

[HttpGet]
public IHttpActionResult DownloadFile()
{
    var file = File.ReadAllBytes(@"c:\path\to\large\file.jpg");
    return new FileContentResult(file, "application/octet-stream") { FileDownloadName = "file.jpg" };
}

这种方式简单易用,但是当文件大小超过几十兆时,会导致内存占用过大,可能会导致应用程序崩溃。

流式传输大文件

为了解决内存和性能问题,我们可以使用流式传输大文件的方式。具体实现如下:

[HttpGet]
public async Task<HttpResponseMessage> DownloadFile()
{
    var filePath = @"c:\path\to\large\file.jpg";
    var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
    var response = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new StreamContent(stream)
    };
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = "file.jpg" // 文件名
    };
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    response.Content.Headers.ContentLength = stream.Length;
    return response;
}

代码解释:

  • 使用FileStream读取文件。
  • 将文件流作为StreamContent的内容。
  • 设置响应头,包括Content-Disposition文件下载名和Content-Type文件类型。
  • 设置Content-Length头,这是可选的,但是有这个头,浏览器就可以显示下载进度条了。
反馈

以上就是Web API流式传输大文件的介绍。如果您在实现过程中遇到困难或者有更好的解决方案,请在评论区留言,我们会积极回复。