You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 5中实现documentUploadProvinceLevels表文件下载功能求助

ASP.NET Core 5 实现数据库文件下载功能

核心思路

你的上传逻辑已经将文件二进制数据存入documentUploadProvinceLevels表的dataBytes字段,下载的核心就是:查询目标文件记录 → 读取二进制数据 → 返回FileResult给客户端


1. 编写文件查询方法

先实现从数据库获取有效文件记录的逻辑(可放在服务层或直接在控制器中调用上下文):

// 根据文件ID获取未删除的文件记录
public DocumentUploadProvinceLevel GetValidDocument(int documentId)
{
    return _context.documentUploadProvinceLevels
        .FirstOrDefault(doc => doc.id == documentId && !doc.IsDelete);
}

// 根据用户ID获取该用户所有未删除的文件
public List<DocumentUploadProvinceLevel> GetUserValidDocuments(string userId)
{
    return _context.documentUploadProvinceLevels
        .Where(doc => doc.userId == userId && !doc.IsDelete)
        .ToList();
}

2. 实现下载接口(控制器Action)

在控制器中编写下载Action,直接返回文件流给客户端:

单文件下载(按ID)

[HttpGet("download/{id}")]
public IActionResult Download(int id)
{
    var doc = GetValidDocument(id);
    if (doc == null || doc.dataBytes == null || doc.dataBytes.Length == 0)
    {
        return NotFound("文件不存在或已被删除");
    }

    // 根据文件扩展名匹配对应MIME类型
    string mimeType = doc.fileFormat.ToLower() switch
    {
        ".jpg" or ".jpeg" => "image/jpeg",
        ".png" => "image/png",
        ".pdf" => "application/pdf",
        ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        _ => "application/octet-stream" // 通用二进制流类型,适配未定义格式
    };

    // 返回文件,第三个参数是浏览器下载时显示的文件名
    return File(doc.dataBytes, mimeType, doc.fileName);
}

获取用户文件列表(带下载链接)

如果需要先展示用户的文件列表,再提供下载入口,可添加这个Action:

[HttpGet("user/{userId}/files")]
public IActionResult GetUserFiles(string userId)
{
    var docs = GetUserValidDocuments(userId);
    if (!docs.Any())
    {
        return NotFound("该用户暂无可用文件");
    }

    // 返回文件基础信息和下载链接(前端可直接拼接使用)
    var fileList = docs.Select(doc => new
    {
        doc.id,
        doc.fileName,
        doc.title,
        doc.uploadDate,
        DownloadLink = Url.Action("Download", new { id = doc.id })
    });

    return Ok(fileList);
}

3. 前端调用示例

直接用a标签下载

<!-- 假设接口路由为/api/documents/download/1 -->
<a href="/api/documents/download/1" download>点击下载文件</a>

异步请求下载(适配鉴权场景)

async function downloadFile(documentId) {
    const response = await fetch(`/api/documents/download/${documentId}`, {
        method: 'GET',
        credentials: 'include' // 携带Cookie,适配需要登录鉴权的场景
    });

    if (!response.ok) {
        alert('下载失败:文件不存在');
        return;
    }

    const blob = await response.blob();
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    // 可从响应头获取文件名:response.headers.get('content-disposition')
    a.download = '自定义文件名';
    a.click();
    window.URL.revokeObjectURL(url);
}

注意事项

  • 必须校验IsDelete字段,避免返回已标记删除的文件
  • MIME类型映射可根据业务需求扩展,确保浏览器能正确识别文件类型
  • 若业务中存在大文件(如超过100MB),建议将文件存储到本地文件系统或云存储,数据库仅保存文件路径,避免数据库性能下降

内容的提问来源于stack exchange,提问作者Ashkan Amjad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:55:32