和问题说的差不多。现在我用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
文件,那就太好了.
先谢了。
3条答案
按热度按时间7fyelxc51#
问题
当你在一台远程计算机上运行一个程序时(这是你在pythonanywhere的服务器),所有的操作都发生在那台远程计算机上,而不是用户的机器上。
因此,当你在远程计算机上下载东西时,它会被下载到远程计算机(pythonanywhere)。
A溶液
要满足您的要求(将文件下载到用户的计算机,而不是服务器),您可能会执行以下操作:
YouTube....download()
所做的那样。FileResponse
所做的为什么会这样?
每次你在浏览器中访问你的页面时,你的django应用程序大致会做以下几件事:
通常Django应用程序会返回一个HTML页面,但HTML页面只是一个文件,你正在下载的Youtube视频也是如此,你可以选择返回视频文件而不是网页,用户的浏览器会尝试打开该文件。
如何选择下载位置?
您的Django应用程序无法选择用户电脑上的下载位置。如果任何网站都可以从您电脑上的任何位置下载文件,这将是一件危险的事情。
但是,当您将文件发送给用户时,他们可以选择下载位置。
如果您查看FileResponse的文档,您会发现可以传递一个
as_attachment=True
参数。这将使Django以“附件”的形式发送一个文件,意味着它将尝试下载该文件但不打开它。这将提示用户选择文件的下载位置。
yduiuuwa2#
我也提出了同样的问题,但我减少了这个问题的80%...所以,看到我的解决方案,我希望你的帮助这个解决方案:)
第一个导入模块
然后代码。
不能使用返回重定向函数,可以使用FileResponse函数
jhiyze9q3#
我也在为这个问题而挣扎。我读了别人在这里添加的内容,但那对我不起作用。
然后我在this website找到了丢失的那一块。为了下载文件,你必须把
as_attachment=Ture
包含到FileResponse
中。所以,最后的答案将如下:
return FileResponse(open(youtube.download(skip_existing=True),'rb'), as_attachment=True)
这将允许文件下载到用户设备上的“Downloads”目录;不在你的pythonanywhere服务器上。
注意:即使下载了文件,用户也会停留在此页面。