gpt4 book ai didi

python - Flask.Response 在网络浏览器中无法开始下载

转载 作者:太空宇宙 更新时间:2023-11-03 17:58:21 25 4
gpt4 key购买 nike

在 Flask(微型 Web 框架)中,我们有一个 View :

@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 指定)。

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

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底层原始文件对象;这应该也有效,但还有一个额外的优点,即保留 YouTube 应用的任何压缩。

一些下载管理器可能会尝试使用 HTTP range request并行获取下载,即使服务器没有宣传它支持此类请求。您可能应该使用 406 Not Acceptable 响应进行响应(在不支持的情况下请求字节范围是 Accept-* 违规)。您需要记录下载管理器发送的 header 以确定情况是否如此。

关于python - Flask.Response 在网络浏览器中无法开始下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28147481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com