Flask项目部署至Heroku后OS模块无法正常保存文件如何解决
Heroku部署Flask项目无法写入本地文件解决方案
核心原因
Heroku采用临时文件系统(ephemeral filesystem),所有运行时写入磁盘的文件,会在dyno重启、应用重新部署、每24小时dyno自动回收三个节点被全部清空。且应用运行时仅/tmp目录拥有写入权限,直接写入项目根目录下的自定义文件夹会触发权限错误或写入后丢失的问题。
可行解决方案
临时文件处理方案
如果上传文件仅需临时处理(比如上传后即刻解析、转存其他位置,不需要长期留存),直接修改存储路径到/tmp目录即可:
- 调整Flask上传目录配置,示例代码如下:
import os # 替换原有UPLOAD_FOLDER配置为/tmp下的子目录 app.config['UPLOAD_FOLDER'] = '/tmp/project_uploads' # 应用启动时自动创建目录,避免路径不存在报错 os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
- 该路径下的文件仅当前dyno的当前运行周期可访问,跨dyno或dyno重启后无法访问。
持久化存储方案
如果文件需要长期留存,必须放弃本地写入逻辑,对接第三方对象存储服务:
- 可选服务包括AWS S3、阿里云OSS、七牛云等公有云对象存储产品
- 可直接用Flask配套扩展简化适配流程,仅需修改原有文件读写逻辑为调用对象存储SDK,前端上传逻辑无需调整
- 所有文件直接存储到对象存储,后续通过公网地址访问即可,完全避开Heroku本地文件系统限制
其他排查方向
- 确认目标目录是否在构建阶段正确创建:如果需要使用构建阶段生成的静态目录,需将目录创建逻辑写入构建钩子,不能在运行时动态创建项目根目录下的文件夹
- 可执行
heroku logs --tail命令查看实时运行日志,定位具体报错是路径不存在还是权限不足问题
内容的提问来源于stack exchange,提问作者Abdul kaleem Khan
相关产品推荐
相关产品推荐

