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

Django Web应用移动端Chrome/Safari强制下载FileField视频文件问题

解决Django中视频文件触发下载而非直接打开的问题

嘿,我看你碰到的问题是在Django里返回视频文件时,移动端浏览器总是直接打开文件而不是触发下载弹窗对吧?问题根源就在你写的Content-Disposition响应头设置上,咱们来一步步修正:

核心错误分析

你原来的代码里这行是错的:

response['Content-Disposition: attachment'] = 'inline; filename=' + os.path.basename(file_path)

有两个关键问题:

  1. HTTP响应头的键应该是Content-Disposition,而不是Content-Disposition: attachment——attachment是这个头的值的一部分,不是键的组成部分
  2. inline参数的作用就是告诉浏览器「直接打开该文件」,要触发下载必须改成attachment

修正后的完整视图代码

推荐用Django的FileResponse替代HttpResponse,它更适合处理大文件(比如视频),不会一次性把文件读进内存:

import os
from django.http import FileResponse, HttpResponse
from urllib.parse import quote

def download(request):
    file_path = 'movie.mp4'
    # 如果是从Model的FileField获取路径,应该写成类似:obj.video_file.path(obj是你的模型实例)
    if os.path.exists(file_path):
        # 打开文件并创建FileResponse
        response = FileResponse(open(file_path, 'rb'), content_type="video/mp4")
        # 处理文件名的URL编码,避免特殊字符导致的显示或下载问题
        encoded_filename = quote(os.path.basename(file_path))
        # 正确设置Content-Disposition头,明确触发下载行为
        response['Content-Disposition'] = f'attachment; filename="{encoded_filename}"'
        return response
    # 处理文件不存在的异常情况
    return HttpResponse("请求的视频文件不存在", status=404)

额外的移动端优化建议

在前端的下载按钮链接上加上download属性,能进一步确保移动端Chrome/Safari触发下载行为:

<a href="{% url '你的下载视图URL名称' %}" download>下载视频</a>

这个属性在同域请求下对移动端主流浏览器都能很好地生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:32:40