Node.js使用ftp模块上传文件时内容变为文件名的问题求助
解决FTP上传文件内容变成文件名的问题
嘿,我之前用npm的ftp模块时也踩过这个一模一样的坑!你遇到的问题大概率是上传方法的参数传错了——把文件名当成文件内容传给FTP客户端了,所以服务器上的foo.txt才会显示"foo.txt"而不是原文件里的测试文本。
常见错误原因
你可能写了类似这样的错误代码:
const Client = require('ftp'); const client = new Client(); client.connect({/* 你的FTP服务器配置 */}); client.on('ready', () => { // 错误:第一个参数传了文件名字符串,而非文件内容/流 client.put('foo.txt', 'foo.txt', (err) => { if (err) throw err; client.end(); }); });
这里put方法如果接收的第一个参数是字符串,FTP客户端会直接把这个字符串当成文件内容上传,所以服务器上的文件内容自然就是"foo.txt"了。
正确的解决方案
有两种靠谱的方式来上传正确的文件内容:
1. 读取本地文件内容后上传
用fs.readFile读取文件的实际文本内容,再传给put方法:
const fs = require('fs'); const Client = require('ftp'); const client = new Client(); client.connect({ host: '你的FTP服务器地址', user: '用户名', password: '密码' }); client.on('ready', () => { fs.readFile('./foo.txt', 'utf8', (err, fileContent) => { if (err) { console.error('读取本地文件失败:', err); return client.end(); } // 第一个参数是文件内容,第二个是远程文件名 client.put(fileContent, 'foo.txt', (err) => { if (err) { console.error('上传失败:', err); } else { console.log('文件上传成功!'); } client.end(); }); }); });
2. 用文件流上传(更高效)
直接创建本地文件的读取流传给put方法,这种方式适合大文件,不用把整个文件加载到内存:
const fs = require('fs'); const Client = require('ftp'); const client = new Client(); client.connect({ host: '你的FTP服务器地址', user: '用户名', password: '密码' }); client.on('ready', () => { const fileStream = fs.createReadStream('./foo.txt'); // 第一个参数是文件流,第二个是远程文件名 client.put(fileStream, 'foo.txt', (err) => { if (err) { console.error('上传失败:', err); } else { console.log('文件上传成功!'); } client.end(); }); });
额外提示
如果你用的是basic-ftp这个更流行的FTP包(很多人会混淆这两个npm包),上传方法叫upload,用法类似:
const ftp = require('basic-ftp'); const fs = require('fs'); async function uploadFile() { const client = new ftp.Client(); try { await client.access({ host: '你的FTP服务器地址', user: '用户名', password: '密码' }); // 同样用文件流作为第一个参数 await client.upload(fs.createReadStream('./foo.txt'), 'foo.txt'); console.log('上传成功!'); } catch (err) { console.error(err); } client.close(); } uploadFile();
核心就是记住:上传方法的第一个参数需要是文件的实际内容(字符串/Buffer)或者文件流,而不是本地文件名!
内容的提问来源于stack exchange,提问作者Dave S
相关产品推荐
相关产品推荐

