如何修复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
相关产品推荐
相关产品推荐

