我使用Flask路由作为代理来下载文件,如下所示:
@esa_handler.route("/data/<int:series>/<int:file_num>", methods=["GET"])
def DownloadRemote(series, file_num):
"""
Downloads the remote files from the ESA.
:param series: 0-20.
:param file_num: File within the series, 0-255
:return: Compressed CSV file.
"""
# if the file is bad.
if series >= 20 and file_num > 110:
return jsonify({"error": "file does not exist."})
url = "http://cdn.gea.esac.esa.int/Gaia/gaia_source/csv/GaiaSource_000-{:03d}-{:03d}.csv.gz".format(series,
file_num)
req = requests.get(url, stream=True)
return Response(stream_with_context(req.iter_content(chunk_size=2048)), content_type=req.headers["content-type"])
它工作正常,但是,呈现给客户端的文件名是传递给端点的文件号。例如,如果我将http://127.0.0.1:5000/esa/data/0/0
下载到第一个文件,则会下载,但Chrome / Firefox / IE / Edge会将文件保存为&#34; 0&#34;。虽然没有任何问题,但我希望有更好的用户体验。
如何根据请求的URL拦截响应以提供文件名?
答案 0 :(得分:0)
这可以通过Content-Disposition
HTTP标头完成。在这里,您可以为新下载的文件指定文件名。
可以将其添加到烧瓶Response
中,如下所示:
url = "http://cdn.gea.esac.esa.int/Gaia/gaia_source/csv/GaiaSource_000-{:03d}-{:03d}.csv.gz".format(series,
req = requests.get(url, stream=True)
headers = Headers()
headers .add('Content-Type', req.headers["content-type"])
headers .add('Content-Disposition', 'attachment; filename="filename.txt"')
return Response(stream_with_context(req.iter_content(chunk_size=2048)), headers=headers)
注意:为简单起见,Content-Type
已移至headers