Python 如何更改flask中的下载名称?

Python 如何更改flask中的下载名称?,python,flask,Python,Flask,我有一个小项目,它必须响应一些文件。我知道使用nginx将是更好的选择,但文件量非常小 我计划的一部分: return send_file(os.path.join(filepath, filename)) 该行返回文件名为download,没有任何格式或类似内容。下载的文件名总是相同的,不依赖于文件的真实名称。文件的真实名称是table.csv。如何返回文件名正确的文件?您需要设置内容配置:附件;filename=..HTTP头,用于浏览器使用正确的文件名 通过将设置为\u attachme

我有一个小项目,它必须响应一些文件。我知道使用
nginx
将是更好的选择,但文件量非常小

我计划的一部分:

return send_file(os.path.join(filepath, filename))

该行返回文件名为
download
,没有任何格式或类似内容。下载的文件名总是相同的,不依赖于文件的真实名称。文件的真实名称是
table.csv
。如何返回文件名正确的文件?

您需要设置
内容配置:附件;filename=..
HTTP头,用于浏览器使用正确的文件名

通过将
设置为\u attachment=True
参数,可以让
send\u file()
为您设置此标题。然后从传入的文件对象中获取文件名。使用
attachment\u filename
参数显式设置不同的文件名:

return send_file(os.path.join(filepath, filename), as_attachment=True)
从:

  • 作为附件
    –如果要使用
    内容处置:附件
    标题发送此文件,请设置为
    True
  • 附件\u文件名
    –附件的文件名(如果与文件名不同)
您可能希望使用。该函数首先确保文件名存在(如果不存在,则引发
NotFound
),并确保文件名不包含任何可能用于“转义”目录的
相关元素。对从不受信任的来源获取的所有文件名使用此选项:

return send_from_directory(filepath, filename, as_attachment=True)

在某些情况下,文件名仍然不可见。为了确保它,您应该设置“x-filename”标题并公开此标题

from flask import send_file
response = send_file(absolute_image_path, mimetype='image/jpeg', attachment_filename=name, as_attachment=True)
response.headers["x-filename"] = name
response.headers["Access-Control-Expose-Headers"] = 'x-filename'
return response

在我的情况下,将
设置为_attachment
attachment_filename
不起作用,因为
内容处置:attachment
不会出现在响应的客户端副本中

如果已启用,则可以将其初始化为指定文件名的自定义标题(例如“x-Suggered-filename”)。然后将该标题添加到响应中

# In file where the Flask app instance is initialized
app = Flask(__name__)
CORS(app, expose_headers=["x-suggested-filename"])

# In file with the download endpoint
result = send_file("/full/path/to/some/file",
                   mimetype="text/plain", # use appropriate type based on file
                   as_attachment=True,
                   conditional=False)
result.headers["x-suggested-filename"] = "use_this_filename.txt"
return result
然后,在客户端下载代码中,您可以检查响应头以从相同的自定义头中获取文件名:


我以前遇到过这个问题,我尝试了这里提到的许多解决方案,最后我可以通过编写文件的正确的mimetype来解决这个问题

以下是我的例子:

@app.route('/download_report')
def download_summary():
    return send_file('Report.csv', mimetype='application/x-csv', attachment_filename='summary_report.csv', as_attachment=True)

设置为\u attachment=True
for
send\u file
以设置所需的HTTP头,如果要使用与文件对象上已设置的名称不同的名称,请设置
attachment\u filename
。也遇到了此问题。FileSaver救了我的命!您只需公开内容处置头
cors=cors(app,expose_headers=[“Content Disposition”])
就可以了,但我遇到了http浏览器缓存的问题,它没有重试下载,并获得了相同的文件名。因此,那些发现此解决方案不起作用的人,只是为了确保尝试使用匿名/私有模式浏览器来验证不完全相关,但万一有人遇到相同的问题,我意识到
文件路径
不能像用于静态文件(
/static/img/hi.png“
)的文件路径那样,但前面必须有一个点(
/static/img/hi.png“
)。它似乎是从其他地方开始的。@Rusca8:是的,因为
os.path.join()
必须假设以
/
开头的组件是绝对文件名。不要使用
/static/..
,使用
static/..
(无前导斜杠)。
@app.route('/download_report')
def download_summary():
    return send_file('Report.csv', mimetype='application/x-csv', attachment_filename='summary_report.csv', as_attachment=True)