send_file最稳妥,自动处理MIME类型、Content-Length和缓存头;路径须为绝对或相对app.root_path;内存字节流需用io.BytesIO包装;大文件应流式响应,返回生成器yield分块bytes。Flask怎么用send_file返回图片或PDF这类二进制文件直接用 send_file 最稳妥,它自动处理 MIME 类型、Content-Length 和缓存头,比手动构造响应安全得多。别自己拼 Response + bytes,容易漏掉 Content-Type 或编码声明。常见错误现象:UnicodeDecodeError(误把字节当字符串)、浏览器下载乱码文件、图片显示为黑屏或“无法加载”。路径必须是服务器本地存在的绝对路径或相对于 app.root_path 的相对路径;传入内存字节流时,得用 io.BytesIO 包一层再传给 send_file如果文件来自数据库 blob 字段或网络请求结果,别写成 send_file("/tmp/xxx") —— 临时文件有竞态和清理风险,直接走 io.BytesIO(data) + download_name 参数mimetype 参数不填也能猜,但建议显式指定,比如 mimetype="image/png";PDF 必须设 "application/pdf",否则 Chrome 可能强行在线预览失败大文件(>10MB)慎用 send_file 默认行为,它会一次性读入内存;改用 use_x_sendfile=True(需 Nginx 配合)或分块流式响应(见下一条)需要流式传输大文件时,为什么不能直接 return BytesIO 对象Flask 的响应体要求是可迭代的字节序列(Iterable[bytes]),而 BytesIO 本身不是可迭代对象 —— 它得先 .getvalue()(吃内存)或用 .read() 分块调用才行。使用场景:导出百万行 CSV、返回视频片段、代理下游服务的原始响应流。立即学习“Python免费学习笔记(深入)”; WisPaper 复旦大学研发的AI学术搜索工具,5分钟内筛选1000篇论文
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/281240.html