flask:文件下载send_from_directory
flask.send_from_directory(directory,filename,** options )directory –所有文件的存储目录。filename –相对于要下载的目录的文件名。options –直接转发到的可选关键字参数send_file()。from flask import send_from_directory@app.route('/download/<p
·
flask.send_from_directory(directory,filename,** options )
- directory –所有文件的存储目录。
- filename –相对于要下载的目录的文件名。
- options –直接转发到的可选关键字参数send_file()。
from flask import send_from_directory
@app.route('/download/<path:path>', methods=['GET', 'POST'])
def index(path):
try:
if os.path.isdir(filePath):
return '<h1>文件夹无法下载</h1>'
else:
name=filePath.split('\\')[-1]#切割出文件名称
filePath=filePath.replace(name,'')
return send_from_directory(filePath,filename=name,as_attachment=True)
except:
return '<h1>该文件不存在或无法下载</h1>'
filePath:文件的绝对路径,不包含文件名
filename:文件名称
as_attachment:是否显示文件名称as_attachment –设置为True是否要发送带有标题的文件。Content-Disposition: attachment
如果设置为False则浏览器返回文件预览 如果该文件可以被浏览器渲染,例如 pdf 图片 等
notice:
- 传入参数path必须为绝对路径
- 若path所指文件不存在,不会有任何返回数据,造成用户体验下降
- 若path所指文件不存在,可用404装饰器返回错误,或则用try语句包裹
流式下载
@app.route('/download/<filename>')
def uploaded_file(filename):
def send_file():
store_path = os.path.join(UPLOAD_FOLDER,filename)
with open(store_path, 'rb') as targetfile:
while 1:
data = targetfile.read(1 * 1024 * 1024) # 每次读取1MB (可用限速)
if not data:
break
yield data
response = Response(send_file(), content_type='application/octet-stream')
response.headers["Content-disposition"] = 'attachment; filename=%s' % filename # 如果不加上这行代码,导致下图的问题
return response
发送文件和性能
强烈建议激活X-Sendfile您的Web服务器中的支持或(如果没有进行身份验证)告诉Web服务器自行为给定路径提供文件,而无需调用Web应用程序以提高性能。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)