以下代码将Postgres BYTEA列流传输到浏览器。
from flask import Response, stream_with_context
@app.route('/api/1/zfile/<file_id>', methods=['GET'])
def download_file(file_id):
file = ZFile.query.filter_by(id=file_id).first()
return Response(stream_with_context(file.data), mimetype=file.mime_type)
下载速度极慢(大约5 MB需要6分钟)。
我正在使用curl从同一主机下载,因此网络不是问题, 而且我可以在不到一秒钟的时间内从psql控制台中提取文件, 因此似乎数据库方面也不应受到责备:
COPY (select f.data from z_file f where f.id = '4ec3rf') TO 'zazX.pdf' (FORMAT binary)
更新:
我有更多证据表明“从数据库获取数据”步骤并不慢。如果我使用
fs.writeFile()
将file.data
写入文件,则会发现这个操作比读取数据库更耗时。
with open("/vagrant/zoz.pdf", 'wb') as output:
output.write(file.data)
同时,它只需要几分之一秒的时间。因此,Flask的流式传输方式导致了速度较慢。