Flask 如何在文件下载中添加 HTTP content-length header
在本文中,我们将介绍如何使用Flask和Werkzeug来在文件下载中添加HTTP content-length header。HTTP content-length header是一个可选的HTTP header,用于指示响应主体的字节长度。它可以帮助浏览器准确地知道下载文件的大小,并在下载进度条中显示百分比。
阅读更多:Flask 教程
1. 安装 Flask 和 Werkzeug
首先,我们需要安装Flask和Werkzeug。可以使用以下命令来安装它们:
pip install Flask
pip install Werkzeug
2. 创建 Flask 应用
创建一个Flask应用,并定义一个路由来处理文件下载请求。在这个例子中,我们将通过/download
路由来触发文件下载:
from flask import Flask, send_file, make_response
app = Flask(__name__)
@app.route('/download')
def download_file():
file_path = '/path/to/file.txt'
file_name = 'file.txt'
response = make_response(send_file(file_path, as_attachment=True, attachment_filename=file_name))
return response
在上面的代码中,我们使用send_file
函数来发送文件给客户端。attachment_filename
参数用于指定下载的文件名称,as_attachment=True
表示将文件作为附件下载。
3. 使用 Werkzeug 添加 content-length header
要添加content-length header,我们可以使用Werkzeug提供的FileWrapper
。
from flask import Flask, send_file
from werkzeug import FileWrapper
app = Flask(__name__)
@app.route('/download')
def download_file():
file_path = '/path/to/file.txt'
file_name = 'file.txt'
wrapper = FileWrapper(open(file_path, 'rb'))
response = app.response_class(wrapper, mimetype='application/octet-stream')
response.headers['Content-Length'] = os.path.getsize(file_path)
response.headers['Content-Disposition'] = 'attachment; filename=' + file_name
return response
在上面的代码中,我们首先通过FileWrapper
包装了要下载的文件。然后,我们创建一个response
对象,并将FileWrapper
作为响应主体传递给app.response_class
。接下来,我们使用os.path.getsize
函数获取文件的大小,并将其设置为Content-Length
header的值。最后,我们设置Content-Disposition
header来指定下载的文件名。
4. 运行 Flask 应用
最后,我们需要运行Flask应用以测试文件下载。可以使用以下命令运行应用:
python your_app.py
然后,在浏览器中访问http://localhost:5000/download
,将会下载指定的文件,并在下载进度条中显示百分比。
总结
通过Flask和Werkzeug,我们可以轻松地在文件下载请求中添加HTTP content-length header。这可以帮助浏览器准确地知道下载文件的大小,并提供更好的用户体验。希望本文对你有所帮助!