You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Multer-sftp无法通过21端口上传?GoDaddy无SFTP环境适配咨询

关于multer-sftp在21端口下无法工作的原因及解决方案

首先得明确一个核心区别:multer-sftp是专门为SFTP协议设计的存储引擎,而SFTP(SSH File Transfer Protocol)是基于SSH的文件传输协议,默认使用22端口;21端口则是传统FTP(或加密版FTPS)的默认端口——这俩是完全不同的协议,不存在“把SFTP端口改成21就能兼容使用”的情况,所以你的配置肯定没法正常工作。

为什么你的现有配置行不通?

你把multer-sftp的端口设为21,相当于让一个SFTP客户端去连接FTP服务器的端口,协议底层逻辑完全不兼容,必然会出现连接失败、无法传输文件的问题。multer-sftp根本没有处理FTP协议的代码,自然没法和21端口的FTP服务通信。

可行的解决方案

既然你的GoDaddy套餐只能用21端口的FTP/FTPS,那得换用支持FTP协议的multer存储引擎,比如multer-ftp或者multer-ftps,下面给你一个简单的示例配置(以multer-ftp为例):

const multer = require('multer');
const FTPStorage = require('multer-ftp');

const storage = new FTPStorage({
  basepath: '/src/public/uploads/',
  ftp: {
    host: 'xxx.xxx.xxx.xxx',
    port: 21,
    user: 'username',
    password: 'password'
  },
  destination: function (req, file, cb) {
    const userUploadDir = `${req.user.id}`;
    // 部分FTP存储引擎会自动创建不存在的远程目录,如果不行,可能需要手动通过FTP命令创建
    cb(null, userUploadDir);
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + '-' + file.originalname);
  }
});

const upload = multer({ storage: storage });

如果GoDaddy要求使用加密的FTPS(而非明文FTP),建议改用multer-ftps,并在配置中添加安全相关选项,比如:

ftp: {
  host: 'xxx.xxx.xxx.xxx',
  port: 21,
  user: 'username',
  password: 'password',
  secure: true, // 启用FTPS加密传输
  secureOptions: { /* 可选的TLS配置参数 */ }
}

额外提醒

你原来代码里的mkdirp是在本地创建目录,但上传到远程FTP服务器时,本地创建目录是无效的——需要确保远程服务器上的目标目录存在,或者使用支持自动创建远程目录的存储引擎。

内容的提问来源于stack exchange,提问作者Filip Pejakovic

火山引擎 最新活动