下载youtube视频到Django网站上的用户机器

cwtwac6a  于 2023-03-20  发布在  Go
关注(0)|答案(3)|浏览(140)

和问题说的差不多。现在我用pytube有这个函数:

def download(request, video_url):
        url='http://www.youtube.com/watch?v='+str(video_url)
        homedir = os.path.expanduser("~")
        dirs = homedir + '/Downloads'
        download = YouTube(url).streams.first().download(dirs)   
        return redirect('../../')

但是这会把视频下载到pythonanywhere的一个目录/Downloads/-我已经把我的项目上传到了这个网站。
我怎样把视频下载到用户的机器上?解决方案不一定要用pytube包,因为我只是想知道答案.如果你告诉我如何把文件下载成.mp3文件,那就太好了.
先谢了。

7fyelxc5

7fyelxc51#

问题
当你在一台远程计算机上运行一个程序时(这是你在pythonanywhere的服务器),所有的操作都发生在那台远程计算机上,而不是用户的机器上。
因此,当你在远程计算机上下载东西时,它会被下载到远程计算机(pythonanywhere)。

A溶液

要满足您的要求(将文件下载到用户的计算机,而不是服务器),您可能会执行以下操作:

  • 从youtube本地下载文件(就像你目前对YouTube....download()所做的那样。
  • 将文件发送给用户,这就是Gagan Aggarwal's solution试图对django的FileResponse所做的

为什么会这样?

每次你在浏览器中访问你的页面时,你的django应用程序大致会做以下几件事:

  • 它接收来自用户的请求
  • 然后返回响应

通常Django应用程序会返回一个HTML页面,但HTML页面只是一个文件,你正在下载的Youtube视频也是如此,你可以选择返回视频文件而不是网页,用户的浏览器会尝试打开该文件。

如何选择下载位置?

您的Django应用程序无法选择用户电脑上的下载位置。如果任何网站都可以从您电脑上的任何位置下载文件,这将是一件危险的事情。
但是,当您将文件发送给用户时,他们可以选择下载位置。
如果您查看FileResponse的文档,您会发现可以传递一个as_attachment=True参数。
这将使Django以“附件”的形式发送一个文件,意味着它将尝试下载该文件但不打开它。这将提示用户选择文件的下载位置。

yduiuuwa

yduiuuwa2#

我也提出了同样的问题,但我减少了这个问题的80%...所以,看到我的解决方案,我希望你的帮助这个解决方案:)
第一个导入模块

from django.http import FileResponse

然后代码。

return FileResponse(open(YouTube(url).streams.first().download(skip_existing=True),'rb'))

不能使用返回重定向函数,可以使用FileResponse函数

jhiyze9q

jhiyze9q3#

我也在为这个问题而挣扎。我读了别人在这里添加的内容,但那对我不起作用。
然后我在this website找到了丢失的那一块。为了下载文件,你必须把as_attachment=Ture包含到FileResponse中。
所以,最后的答案将如下:
return FileResponse(open(youtube.download(skip_existing=True),'rb'), as_attachment=True)
这将允许文件下载到用户设备上的“Downloads”目录;不在你的pythonanywhere服务器上。
注意:即使下载了文件,用户也会停留在此页面。

相关问题