You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:48:01