使用Node.js promise-ftp上传文件报错:找不到文件或目录
解决promise-ftp上传文件报错553(Can't open that file)的问题
针对你遇到的553错误,这个报错本质是FTP服务器端无法创建/写入目标文件,和本地文件是否存在无关。下面是具体排查和解决步骤:
1. 检查FTP目标路径的有效性
- 确认目标目录存在:如果
destPath包含子目录(比如/data/inventory.txt),必须先在FTP服务器上创建/data目录——FTP不会自动递归创建目录,目录不存在直接报553。 - 使用绝对路径:避免用相对路径(比如
./inventory.txt),因为FTP登录后的默认工作目录可能不是你预期的位置,直接写服务器的绝对路径(比如/public/inventory.txt)更可靠。 - 排查文件名问题:如果文件名包含空格、中文或特殊符号(比如
#、&),部分FTP服务器不支持,改成纯英文数字的文件名测试。
2. 验证FTP账号权限
- 确认你的FTP账号对目标目录有写入权限:很多553错误是因为账号只能读不能写,或者目录权限被限制。
- 检查服务器上传规则:部分FTP服务器会限制文件类型、大小,或者禁止上传到根目录,尝试上传到服务器允许的目录(比如
/uploads)。
3. 优化代码上传方式
用绝对路径指定本地文件
避免相对路径的歧义,用path.resolve生成本地文件的绝对路径:
const filePath = path.resolve(__dirname, 'inventory.txt'); console.log('本地绝对路径:', filePath); // 打印确认路径正确 await ftp.put(filePath, destPath);
用可读流上传
直接传入文件流比文件路径更稳定,能避免部分文件读取的隐性问题:
const readStream = fs.createReadStream('./inventory.txt'); await ftp.put(readStream, destPath);
确保FTP连接状态正常
在上传前确认已成功连接并登录,添加日志排查:
async function upload() { const ftp = new PromiseFtp(); try { await ftp.connect({ host: '你的FTP地址', user: '账号', password: '密码' }); console.log('FTP连接成功'); // 上传操作... } catch (err) { console.error('连接失败:', err); } finally { await ftp.end(); } }
4. 开启被动模式
部分FTP服务器强制要求被动模式,在连接时开启pasv选项:
await ftp.connect({ host: '你的FTP地址', user: '账号', password: '密码', pasv: true // 启用被动模式 });
5. 最小化测试代码
用最简代码排除其他业务逻辑干扰,先确保基础上传功能正常:
const PromiseFtp = require('promise-ftp'); const fs = require('fs'); const path = require('path'); async function testUpload() { const ftp = new PromiseFtp(); try { await ftp.connect({ host: '你的FTP主机', user: '你的用户名', password: '你的密码' }); console.log('已连接FTP'); const localFile = path.resolve(__dirname, 'inventory.txt'); console.log('本地文件存在:', fs.existsSync(localFile)); // 尝试上传到FTP根目录 await ftp.put(localFile, '/inventory_test.txt'); console.log('上传成功'); await ftp.end(); } catch (err) { console.error('错误详情:', err); await ftp.end(); } } testUpload();
内容的提问来源于stack exchange,提问作者m_dot_dev
相关产品推荐
相关产品推荐

