Heroku部署Flask应用:文件下载存储位置及低成本方案咨询
关于Heroku上Flask应用的文件存储问题
嘿,我来帮你搞定这个问题!首先得先明确Heroku的核心特性:它的文件系统是临时且短暂的——每次你的dyno重启(比如部署更新、自动休眠唤醒、资源调整),所有本地存储的文件都会被清空,回到你部署时的初始状态。所以哪怕你找到存储位置,也没法长期保留文件哦。
先回答你最关心的:文件存在哪?
- 在本地运行时,文件存在
app.py所在的目录,在Heroku上也是一样的——默认工作目录就是你的应用根目录,和app.py同层级。你可以在代码里加一行print(os.getcwd()),部署后查看Heroku日志就能确认具体路径。不过还是那句话,这个目录里的文件没法持久化。
既然你不想用S3(毕竟文件很小,没必要付费),给你两个更合适的方案:
方案1:直接把文件返回给用户,不存到服务器
既然你下载文件是为了给用户用,完全可以跳过本地存储这一步,直接把下载到的内容作为Flask响应返回给用户,这样既省了存储,又避免了临时文件的问题。修改后的代码如下:
import requests from flask import Flask, make_response app = Flask(__name__) @app.route('/') def hello(): return '<h1>Hello World!</h1>' @app.route('/download') def download(): download_url = "https://www.python.org/static/community_logos/python-logo-master-v3-TM.png" r = requests.get(download_url) # 构造响应,设置正确的headers让浏览器识别为下载文件 response = make_response(r.content) response.headers['Content-Type'] = 'image/png' response.headers['Content-Disposition'] = 'attachment; filename=python_logo.png' return response if __name__ == "__main__": app.run()
这样用户访问/download时,浏览器会直接触发文件下载,根本不用在服务器上存文件,完美解决你的需求。
方案2:临时存储(仅限短期使用)
如果你确实需要在服务器上临时存一下文件(比如要做一些简单处理再用),可以用Heroku提供的/tmp目录,这是官方推荐的临时存储路径,空间限制是每个dyno512MB,足够存你的小文件。修改代码如下:
import requests import os from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return '<h1>Hello World!</h1>' @app.route('/download') def download(): download_url = "https://www.python.org/static/community_logos/python-logo-master-v3-TM.png" # 用/tmp目录存储文件 save_path = os.path.join('/tmp', 'python_logo.png') r = requests.get(download_url) with open(save_path,'wb') as f: f.write(r.content) # 这里可以加后续处理逻辑 return "<h2>Download Complete<h2>" if __name__ == "__main__": app.run()
但一定要记住:/tmp里的文件也会在dyno重启后消失,只能用来做短期临时处理,不能长期保存。
最后再强调一遍:Heroku的本地存储不适合持久化保存文件,你的小文件场景用方案1是最优解,既简单又不用操心存储问题~
内容的提问来源于stack exchange,提问作者DeadMan
相关产品推荐
相关产品推荐

