ASP.NET Web API 通过文件流下载文件的实例

程一诺
程一诺
发布时间:2026-10-13 | 6人浏览过
原创

在 ASP.NET Web API 开发中,返回文件供用户下载是常见需求。本示例演示如何通过构建 HttpResponseMessage,将服务器上的物理文件流直接作为响应内容输出,从而触发客户端的文件保存行为。

实现原理

核心思路是在 Controller 动作方法中:

  1. 获取服务器上目标文件的物理路径。
  2. 创建指向该路径的文件流(FileStream)。
  3. 构造 HttpResponseMessage 对象,状态码设为 200 OK。
  4. 将文件流封装为 StreamContent 赋值给响应的 Content 属性。
  5. 设置响应头:ContentType 设为 application/octet-stream 以表示二进制流,ContentDisposition 设为 attachment 并指定文件名以触发下载。

操作步骤

第1步:添加必要的命名空间引用

确保控制文件引入以下基础库,以便使用文件系统、HTTP 消息头等类:

using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web.Hosting; // 用于解析虚拟路径为物理路径

第2步:配置 DownloadController 控制器

创建一个继承自 ApiController 的控制器,并定义路由前缀。以下是完整的控制器代码示例,其中包含错误处理机制:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web.Http;

namespace DownloadFileFromWebApi.Controllers
{
    [RoutePrefix("download")]
    public class DownloadController : ApiController
    {
        [Route("get_demo_file")]
        public HttpResponseMessage GetFileFromWebApi()
        {
            try
            {
                // 1. 将虚拟路径 (~/) 转换为服务器物理路径
                var FilePath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/download/EditPlus64_xp85.com.zip");
                
                // 2. 打开文件流
                var stream = new FileStream(FilePath, FileMode.Open);
                
                // 3. 构建 HTTP 响应
                HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
                response.Content = new StreamContent(stream);
                
                // 4. 设置内容类型为二进制流
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                
                // 5. 设置附件头,指定浏览器下载时的默认文件名
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                { 
                    FileName = "Wep Api Demo File.zip"
                };
                
                return response;
            }
            catch
            {
                // 若发生异常,返回空内容或错误状态
                return new HttpResponseMessage(HttpStatusCode.NoContent);
            }
        }
    }
}

第3步:验证下载功能

部署应用后,通过浏览器访问对应的 API 地址(例如:http://localhost:端口号/download/get_demo_file)。浏览器接收到带有 attachment 头的响应后,通常会弹出“保存文件”对话框,而非直接在页面中显示。此时即可测试文件的完整性与下载流程是否通畅。

注意事项

  • 路径映射:务必使用 HostingEnvironment.MapPath 正确解析虚拟目录路径,避免因为运行环境不同导致找不到文件。
  • 大文件优化:当前示例直接将整个文件加载到内存流中传输。对于超大文件,建议考虑使用异步流处理或断点续传机制以提升性能。
  • 安全权限:确保运行 ASP.NET 应用的账户对目标文件具有读取权限。

以上就是 ASP.NET Web API 通过文件流下载文件的详细内容,更多关于 C# API 开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表