使用multer-sftp上传文件到远程SFTP服务器时出现Permission denied错误
multer-sftp 上传异常解决方案
1. 修复依赖版本兼容问题
multer-sftp@1.1.1 原生适配的是 ssh2-sftp-client@^5.x 版本,你使用的 v7.1.0 版本重写了部分文件写入API,回调逻辑和入参格式存在不兼容,是触发报错的最常见原因。
解决方式二选一:
- 降级 ssh2-sftp-client 到适配版本,执行命令:
npm uninstall ssh2-sftp-client && npm install ssh2-sftp-client@5.3.2 - 若必须使用 v7.x 版本,自定义修改 multer-sftp 源码中
_handleFile方法的 sftp.put 调用逻辑,匹配 v7.x 的入参要求。
2. 校验SFTP服务端权限与路径配置
- 确认你使用的SFTP账号对目标上传目录有可写权限,权限不足会直接触发写入失败
- 提前在服务端创建好目标上传目录,multer-sftp@1.1.1 不会自动递归创建不存在的目录
- 上传目录请使用服务器端的绝对路径,路径末尾需要带对应操作系统的路径分隔符(Linux 为
/,Windows 为\) - 检查SFTP服务端的单文件上传大小限制,超出限制会被服务端主动断开连接
3. 核对multer-sftp初始化参数
参考以下正确配置示例排查你的初始化参数:
const multer = require('multer'); const SFTPStorage = require('multer-sftp'); const storage = new SFTPStorage({ sftp: { host: 'SFTP服务端IP/域名', port: 22, username: 'SFTP登录账号', password: 'SFTP登录密码', // 私钥登录请补充参数:privateKey: require('fs').readFileSync('本地私钥文件路径') readyTimeout: 30000 // 大文件上传建议调高超时时间,单位毫秒 }, destination: function (req, file, cb) { // 注意路径必须是服务端绝对路径,末尾带分隔符 cb(null, '/home/sftp/upload/') }, filename: function (req, file, cb) { // 自定义文件名避免重名覆盖 cb(null, `${Date.now()}-${file.originalname}`) } }); const upload = multer({ storage: storage });
4. 排查连接与并发问题
- 避免短时间内发起大量并发上传请求,SFTP服务端默认存在最大连接数限制,超出会拒绝新连接
- 如果是跨运营商/跨地域上传,可适当调高
readyTimeout和connectTimeout参数值,避免连接超时断开
内容的提问来源于stack exchange,提问作者Mendrika Rabeh
相关产品推荐
相关产品推荐

