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

如何实现Django+Pytube下载YouTube视频至客户端本地而非服务器

解决Django+Pytube视频下载器无法将文件传到客户端的问题

核心问题原因

你之前的代码都是将视频下载到服务器端文件系统(包括你获取的pathlib.Path.home()是Heroku服务器的用户目录,不是客户端的),服务器和客户端的文件系统完全隔离,所以客户端根本拿不到这些文件。另外,Heroku的文件系统是临时的,重启后所有文件都会被清除,就算存在服务器也没用。

而且,出于安全限制,浏览器不会允许网站直接获取客户端的下载目录路径,只能由浏览器触发下载流程,让用户自行选择保存位置或使用默认下载目录。

正确解决方案:服务器下载后返回文件给客户端

思路是:在服务器临时下载视频,然后将文件作为HTTP响应返回给客户端,让浏览器触发下载,最后删除服务器上的临时文件。

以下是修改后的views.py代码示例:

import os
import tempfile
from django.http import FileResponse
from pytube import YouTube
from django.contrib import messages

def download_video(request):
    if request.method == 'POST':
        url = request.POST.get('url')
        itag = request.POST.get('itag')
        
        try:
            # 创建临时目录存储下载的视频
            with tempfile.TemporaryDirectory() as temp_dir:
                yt = YouTube(url)
                stream = yt.streams.get_by_itag(itag)
                # 下载到临时目录
                video_path = stream.download(output_path=temp_dir)
                # 获取文件名
                filename = os.path.basename(video_path)
                
                # 打开文件并返回给客户端
                response = FileResponse(open(video_path, 'rb'), content_type='video/mp4')
                # 设置响应头,让浏览器触发下载
                response['Content-Disposition'] = f'attachment; filename="{filename}"'
                
                return response
        except Exception as e:
            messages.error(request, f'下载失败:{str(e)}')
            return redirect('/')
    
    return redirect('/')

关键说明

  • 使用tempfile.TemporaryDirectory()创建临时目录,下载完成后会自动清理,避免占用服务器空间
  • FileResponse用于将文件内容作为HTTP响应返回
  • Content-Disposition头设置为attachment,强制浏览器触发下载弹窗,而不是直接播放视频
  • 捕获异常并返回错误提示,提升用户体验

适配移动端/桌面端

这个方案对移动端和桌面端都适用:浏览器会根据设备的默认行为处理下载(比如移动端可能直接保存到相册或下载文件夹,桌面端弹出保存对话框)。

Heroku注意事项

  • Heroku的临时文件系统限制:临时目录里的文件在请求结束后会被清理,符合我们的需求
  • 确保你的Heroku应用有足够的内存处理视频下载(大文件可能需要优化,比如流式传输,但Pytube目前是直接下载到文件)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:24:14