如何在Heroku平台存储用户上传的文件?
Heroku Flask项目用户上传图片存储及调用方案
首先明确Heroku的平台限制:
Heroku的dyno实例采用临时文件系统,任何在实例运行期间写入本地目录的文件,都会在dyno重启、应用重新部署、或平台例行每日重启后被清除。因此直接将用户上传的图片存储到本地文件夹的方案在生产环境完全不可用。
可选存储方案
- 对象存储服务:这是最推荐的生产级方案,你可以选择Heroku生态内的对象存储附加组件,也可以对接自己部署的对象存储服务,所有图片都以对象形式存在独立的存储集群中,不受dyno生命周期影响。
- 如果你的项目仅用于演示、存储量极小且可以接受数据丢失风险,可以考虑使用Heroku提供的免费Redis附加组件存储小体积图片的base64编码内容,不过该方案仅适合测试使用,不推荐生产环境。
Flask集成与调用实现
1. 图片上传存储逻辑
你需要修改原有写本地文件的逻辑,改为上传到对象存储服务,示例逻辑如下:
首先安装对应存储服务的Python SDK,然后在Flask路由中处理:
import uuid import io from flask import Flask, request from PIL import Image # 导入你使用的对象存储SDK import your_object_storage_sdk as oss app = Flask(__name__) # 初始化存储客户端 oss_client = oss.Client(access_key="你的访问密钥", secret_key="你的加密密钥", endpoint="存储服务地址") @app.route('/upload', methods=['POST']) def upload_image(): img_file = request.files['image'] # 生成唯一文件名避免重复冲突 file_key = f"user_upload/{uuid.uuid4().hex}_{img_file.filename}" # 直接上传文件流到对象存储,不需要本地写入 oss_client.put_object(file_key, img_file.read()) # 将file_key存储到你的数据库,后续检测直接用这个key拉取文件 save_to_db(user_id=request.form['user_id'], img_key=file_key) return {"status": "success", "img_key": file_key}
2. 目标检测时调用图片的逻辑
需要检测时,直接通过存储SDK从对象存储拉取文件流到内存即可,不需要落地本地:
def detect_image(img_key): # 从对象存储获取文件字节流 img_bytes = oss_client.get_object(img_key).read() # 直接用图像处理工具从字节流加载图片,不需要写入本地文件 img = Image.open(io.BytesIO(img_bytes)) # 调用你的目标检测模型处理 result = your_detection_model.predict(img) return result
本地调试临时方案(仅开发用,部署到Heroku后无效)
如果你仅在本地开发调试,不需要部署到Heroku,可以沿用原有本地存储逻辑,注意配置静态文件路由:
app.config['UPLOAD_FOLDER'] = './user_uploads' # 配置允许的文件后缀 app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg'}
部署到Heroku后该配置完全无效,必须切换为对象存储方案。
内容的提问来源于stack exchange,提问作者user17518168
相关产品推荐
相关产品推荐

