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




