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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:18:33