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

如何修复Django中点击下载按钮无法获取自动生成xlsm文件的问题

问题根因

你遇到的报错由两个核心错误导致:

  • {% static %} 模板标签仅用于加载项目STATIC_ROOT配置路径下的静态资源,你生成的xlsm文件存放在项目外的独立目录,不属于静态资源范畴,static标签无法解析到对应资源,直接返回404
  • 直接将服务器本地磁盘路径(C:/user/ocr/xxx.xlsm)暴露给前端,浏览器无法识别服务端的本地文件路径,不可能正常触发下载

修复方案

1. 新增下载路由

在你的项目urls.py中新增专门的下载接口路由:

# 路径和命名可根据你的项目调整
path('download-xlsm/<int:pdf_id>/', views.download_xlsm, name='download_xlsm'),

2. 编写下载视图函数

在视图层新增下载处理逻辑,直接读取目标文件返回下载响应,无需暴露本地路径:

import os
from django.http import FileResponse, Http404

def download_xlsm(request, pdf_id):
    # 先根据pdf_id查询对应的pdf记录,这里替换成你自己的ORM查询逻辑
    pdf = YourPdfModel.objects.get(id=pdf_id)
    name = pdf.pdf.name.replace(".xlsm", "").replace(".pdf", "")
    file_path = os.path.join("C:/user/ocr/", f"{name}.xlsm")
    
    # 校验文件是否存在
    if not os.path.exists(file_path):
        raise Http404("报表文件不存在")
    
    # 构造下载响应
    response = FileResponse(open(file_path, 'rb'))
    # 设置正确的xlsm文件头,避免下载异常
    response['Content-Type'] = 'application/vnd.ms-excel.sheet.macroEnabled.12'
    response['Content-Disposition'] = f'attachment; filename="{name}.xlsm"'
    return response

3. 修改前端下载按钮

替换原来的static路径写法,直接指向下载路由:

<a href="{% url 'download_xlsm' pdf.id %}" class="btn btn-outline-primary btn-sm" download>Download Report File</a>

额外注意事项

  • 可根据你的业务逻辑添加权限校验,避免未授权用户任意下载文件
  • 如果生成的xlsm文件体积较大,可替换为StreamingHttpResponse分段返回文件,降低服务端内存占用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 05:36:04