Strapi本地媒体URL返回404,Cloudinary URL正常,求排查方案
核心原因
你配置了Cloudinary作为Strapi的远程媒体存储服务,上传的文件会直接同步到Cloudinary服务器,Strapi本地的uploads目录不会保存这份文件,所以用本地172.20.0.20:1337/uploads/xxx访问自然会返回404。Strapi的本地存储和Cloudinary是互斥配置,启用Cloudinary后,媒体文件的读写逻辑完全转向远程服务,本地不再留存副本。
故障排查及解决步骤
检查媒体存储配置
打开Strapi项目根目录下的config/plugins.js(或config/plugins.ts),确认是否存在Cloudinary的配置代码: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: {}, }, }, }, });若存在这段代码,说明当前确实使用Cloudinary远程存储,本地无文件副本。
验证本地uploads目录
登录Strapi服务器,查看项目根目录下的public/uploads文件夹,确认是否存在你上传的neon_paint_takeover_4k_2_72acd90a9c.png文件。如果没有,即可确认文件仅存储在Cloudinary。切换回本地存储(若需局域网访问)
如果必须通过本地URL访问资源,修改config/plugins.js恢复默认本地存储配置:module.exports = ({ env }) => ({ upload: { config: { provider: 'local', providerOptions: { sizeLimit: 1000000, // 可根据需求调整文件大小限制 }, }, }, });保存配置后重启Strapi服务,重新上传图片,此时文件会保存到本地
public/uploads目录,即可通过172.20.0.20:1337/uploads/xxx访问。检查静态文件服务中间件
切换回本地存储后,确认config/middlewares.js中是否启用了strapi::public中间件(负责提供public目录下的静态文件访问):module.exports = [ 'strapi::errors', 'strapi::security', 'strapi::cors', 'strapi::poweredBy', 'strapi::logger', 'strapi::query', 'strapi::body', 'strapi::session', 'strapi::favicon', 'strapi::public', // 确保该中间件存在 ];若缺失,添加后重启服务即可。
内容的提问来源于stack exchange,提问作者A__

