部署在Heroku的Strapi媒体库图片添加后数分钟无法显示求助
Strapi部署Heroku后媒体文件数分钟后丢失的解决方案
问题根源
Heroku采用临时文件系统(Ephemeral Filesystem),所有存储在应用本地的文件会在应用重启(比如自动休眠、部署更新、资源扩容/缩容)后被彻底清空。Strapi默认将媒体文件存在本地服务器目录,这就导致上传的图片过段时间就找不到了。
解决方案:改用第三方云存储
Heroku上运行的Strapi必须配置持久化云存储来保存媒体文件,推荐以下两种常用方案:
方案1:使用Cloudinary(快速上手)
- 安装Strapi的Cloudinary上传插件:
npm install @strapi/provider-upload-cloudinary - 在Strapi项目的
config/plugins.js(如果没有就新建)中添加配置:module.exports = ({ env }) => ({ upload: { config: { provider: 'cloudinary', providerOptions: { cloud_name: env('CLOUDINARY_NAME'), api_key: env('CLOUDINARY_KEY'), api_secret: env('CLOUDINARY_SECRET'), }, actionOptions: { upload: {}, delete: {}, }, }, }, }); - 登录Heroku控制台,进入你的应用,在「Settings」→「Config Vars」中添加以下环境变量:
CLOUDINARY_NAME:你的Cloudinary账户云名称CLOUDINARY_KEY:你的Cloudinary API密钥CLOUDINARY_SECRET:你的Cloudinary API密钥密码
- 重启Heroku应用,之后上传的媒体文件会自动存储到Cloudinary,不会再丢失。
方案2:使用AWS S3
- 安装Strapi的AWS S3上传插件:
npm install @strapi/provider-upload-aws-s3 - 在
config/plugins.js中添加配置:module.exports = ({ env }) => ({ upload: { config: { provider: 'aws-s3', providerOptions: { accessKeyId: env('AWS_ACCESS_KEY_ID'), secretAccessKey: env('AWS_SECRET_ACCESS_KEY'), region: env('AWS_REGION'), params: { Bucket: env('AWS_BUCKET'), }, }, }, }, }); - 在Heroku的「Config Vars」中添加AWS相关环境变量:
AWS_ACCESS_KEY_ID:AWS IAM用户的访问密钥IDAWS_SECRET_ACCESS_KEY:AWS IAM用户的秘密访问密钥AWS_REGION:S3桶所在的区域(比如us-east-1)AWS_BUCKET:你的S3桶名称
- 确保S3桶的权限策略允许Strapi进行读写操作,可参考AWS官方文档配置对应IAM权限。
注意事项
- 已经丢失的本地媒体文件无法恢复,需要重新上传到新的云存储系统。
- 永远不要在Heroku上依赖本地存储持久化数据,这是平台的核心特性,所有本地文件都会随应用重启被清除。
内容的提问来源于stack exchange,提问作者Faishal Hanif
相关产品推荐
相关产品推荐

