在Flask(微网框架)中,我们认为:
@app.route('/download/<id>/<resolution>/<extension>/')
def download_by_id(id, resolution=None, extension=None):
stream = youtube.stream_url(id, resolution, extension)
binary = requests.get(stream['url'], stream=True)
return flask.Response(
binary,
headers={'Content-Disposition': 'attachment; '
'filename=' + stream['filename']})
在模板中,我们有一个链接<a href="/download/adkdsk457jds/240p/mp4/">Download 240p Video</a>
,当它被点击时,它应该开始下载该视频。在
问题是:
它在一些没有安装IDM等下载管理器的浏览器中工作良好。但IDM无法下载。IDM只是挂在http://example.com/download/adkdsk457jds/240p/mp4/
Firefox自己的下载管理器也是如此。Firefox只下载一个普通的.html页面,而不是实际的视频。在
但是,当没有安装IDM或其他下载管理器时,视频可以在Chrome中成功下载。在
请帮助并建议为什么它不起作用。我需要更改代码吗?在
您还没有包含任何响应信息,包括内容类型;您需要复制一点有关原始响应的更多信息,以传达您返回的响应类型。否则使用默认值(由HTTP标准或Flask指定)。在
具体来说,至少要跨内容类型、长度和传输编码进行复制:
我使用的是
response.raw
底层的raw file对象;这应该也可以工作,但它的另一个优点是YouTube应用的任何压缩都可以保留。在一些下载管理器可能会尝试使用HTTP range request来并行获取下载,即使服务器没有公布它支持此类请求。您可能应该使用一个406 Not Acceptable响应(不支持时请求字节范围是
Accept-*
冲突)。您需要记录下载管理器发送的邮件头,以确定是否存在这种情况。在将
'Content-Type': 'application/octet-stream'
添加到标题相关问题 更多 >
编程相关推荐