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

点击下载PDF却下载网页为.htm格式的技术问题排查

问题分析与修复方案

点击下载按钮本应获取PDF文件,却下载了整个网页为.htm格式,核心问题出在下载逻辑配置错误和前端a标签属性设置不当,以下是具体修复步骤:

1. 修正视图函数(views.py)

你的download_file视图未被实际调用,且Content-Type和Content-Disposition设置有误:

  • Content-Type需改为PDF对应的application/pdf
  • Content-Disposition应使用attachment强制触发下载(inline是在线预览逻辑)
  • 文件名需做转义处理,避免特殊字符导致的解析异常

修改后的代码:

from django.http import HttpResponse
from django.utils.http import urlquote
import os
from django.conf import settings

def download_file(request, path):
    file_path = os.path.join(settings.MEDIA_ROOT, path)
    if os.path.exists(file_path):
        with open(file_path, 'rb') as enm:
            response = HttpResponse(enm.read(), content_type="application/pdf")
            filename = os.path.basename(file_path)
            response['Content-Disposition'] = f'attachment; filename="{urlquote(filename)}"'
            return response
    return HttpResponse("文件不存在", status=404)

2. 修正URL配置(urls.py)

原本用serve直接返回文件,未经过自定义视图处理下载逻辑,需改为指向你的download_file视图:

from django.urls import re_path
from . import views

urlpatterns = [
    re_path(r'^download/(?P<path>.*)$', views.download_file, name='download_file'),
]

3. 修正前端模板(index.html)

  • a标签的href要指向下载视图的URL,而非直接指向文件路径
  • download属性无需填写完整URL,由后端响应头控制文件名即可

修改后的代码:

<div>
    {% for post in file %}
    <h2>{{post.title}}</h2>
    <a href="{% url 'download_file' path=post.admin.upload.name %}" class="home__button anime-text">DOWNLOAD CV</a>
    {% endfor %}
</div>

关键问题总结

  • 前端直接访问文件URL时,服务器未返回正确的下载响应头,导致浏览器无法识别PDF类型, fallback 下载当前网页
  • Content-Type和Content-Disposition是控制浏览器下载行为的核心,必须匹配文件类型并明确指定下载方式
  • download属性填写完整URL会导致浏览器解析异常,后端通过响应头控制文件名更可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:15:31