簡體   English   中英

文件下載的 Flask 代理響應

[英]Flask proxy response for file download

我使用 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 提供使用文件名保存文件作為“0”。 雖然這沒有錯,但我想要更好的用戶體驗。

如何攔截響應以根據請求的 URL 提供文件名?

這可以通過Content-Disposition HTTP 標頭來完成。 您可以在此處為新下載的文件指定文件名。

這可以添加到 FlaskResponse ,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM