Next.js上传图片报错EACCES: Permission denied 本地正常部署后失效
排查解决步骤
EACCES: Permission denied 报错属于操作系统级别的读写权限异常,本地运行正常是因为本地开发账号对项目目录有完整读写权限,线上环境运行Next.js的进程账号权限不足,可按以下步骤排查:
- 第一步:核对进程运行账号与存储目录权限
执行ps aux | grep node查询线上Next.js进程对应的运行用户名,再执行ls -la 你的图片存储目录路径查看目录的所属用户、权限配置。需保证进程运行用户对该存储目录拥有读、写、进入权限(目录需具备执行权限才能进入操作)。
权限修正命令参考:
不要设置777权限,会产生安全风险。# 修正目录所属用户为运行Next.js的账号 chown -R 运行用户名:运行用户组 你的图片存储目录路径 # 或者调整目录权限为755(所有者可读写执行,其他用户可读和执行) chmod -R 755 你的图片存储目录路径 - 第二步:排查部署环境的特殊限制
- 若使用Vercel、Netlify等Serverless平台部署:这类平台的运行环境默认是只读文件系统,仅
/tmp临时目录可写入,且临时目录内容会在请求处理完成后清空,不支持持久化存储本地文件。你需要调整上传逻辑,将图片存储到第三方对象存储服务即可。 - 若使用Docker部署:需确认你已将本地存储目录挂载到容器内部,且Dockerfile中指定的运行账号对该目录有操作权限,可在Dockerfile中提前创建目录并赋权,参考语句:
RUN mkdir -p /app/uploads && chown -R nextjs:nextjs /app/uploads - 若使用Vercel、Netlify等Serverless平台部署:这类平台的运行环境默认是只读文件系统,仅
- 第三步:核对存储路径配置
不要在代码中使用相对路径指定存储目录,线上环境的工作目录可能和本地不一致,建议用process.cwd()拼接绝对路径,参考写法:const uploadDir = path.join(process.cwd(), 'public', 'uploads')
相关报错截图:
内容的提问来源于stack exchange,提问作者Munsif Ali Misri
相关产品推荐
相关产品推荐

