下载无法在web浏览器中启动Flask。响应

2024-10-03 06:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在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中成功下载。在

请帮助并建议为什么它不起作用。我需要更改代码吗?在


Tags: noneidurl管理器stream视频downloadextension
2条回答

您还没有包含任何响应信息,包括内容类型;您需要复制一点有关原始响应的更多信息,以传达您返回的响应类型。否则使用默认值(由HTTP标准或Flask指定)。在

具体来说,至少要跨内容类型、长度和传输编码进行复制:

headers={
    'Content-Disposition': 'attachment; filename=' + stream['filename']
}
for header in ('content-type', 'content-length', 'transfer-encoding'):
    if header in binary.headers:
        headers[header] = binary.headers[header]
return flask.Response(binary.raw, headers=headers)

我使用的是response.raw底层的raw file对象;这应该也可以工作,但它的另一个优点是YouTube应用的任何压缩都可以保留。在

一些下载管理器可能会尝试使用HTTP range request来并行获取下载,即使服务器没有公布它支持此类请求。您可能应该使用一个406 Not Acceptable响应(不支持时请求字节范围是Accept-*冲突)。您需要记录下载管理器发送的邮件头,以确定是否存在这种情况。在

'Content-Type': 'application/octet-stream'添加到标题

相关问题 更多 >