Node.js ftp put方法写入要上载到ftp服务器的文件名,而不是实际文件名

Node.js ftp put方法写入要上载到ftp服务器的文件名,而不是实际文件名,node.js,ftp,Node.js,Ftp,我正在尝试编写一个应用程序,使用npm模块ftp将文件上传到node.js中的ftp服务器。我有一个文件foo.txt,它的内容是一行:“这是一个通过ftp上传的测试文件。”我的代码是: var Client = require("ftp"); var fs = require("fs"); var connection = require("./connections.js"); var c = new Client(); const ftpFolder = "./files/"; va

我正在尝试编写一个应用程序,使用npm模块ftp将文件上传到node.js中的ftp服务器。我有一个文件foo.txt,它的内容是一行:“这是一个通过ftp上传的测试文件。”我的代码是:

var Client = require("ftp");
var fs = require("fs");
var connection = require("./connections.js");

var c = new Client();

const ftpFolder = "./files/";

var fileList = [];

fs.readdir(ftpFolder, (err, files) => {
    if(err) {
        console.log(err);
    } else {
        files.forEach(file => {
            console.log(file);
            fileList.push(file);
        });
    }
    console.log(fileList);
});

c.on("ready", function(){
    fileList.forEach(file => {
        c.put(file, "/backups/" + file, function(err){
            if(err){
                console.log(err);
            } else {
                console.log(file + " was uploaded successfully!");
            }
            c.end();
        });
    });
});

// Connect to ftp site
c.connect(connection.server_ftp);

我在ftp服务器上看到文件foo.txt,但当我打开它时,内容是:“foo.txt”。它似乎已将文件名写入文件,而不是上载文件。任何指导都将不胜感激

当您读取目录时,它会给您一个文件列表。它不读取文件的内容,只列出目录中文件的名称

您需要使用此文件名创建从中读取文件的路径

const path = require('path')
let filePath = path.join(ftpFolder, file)
let fileContents = fs.readFile(path, 'utf8', (err, data) => {
    // do the upload
})
作为旁注。。。当您的目录读取可能工作时,您应该考虑在建立连接之后读取目录。否则,您可能会看到它失败,因为这是客户端连接和目录读取之间的竞争条件。您可能需要读取包含大量文件的目录,以便在客户端连接后解析该目录

您可以嵌套回调,但另一种处理方法是承诺。您可以同时启动这两个异步方法,并在两个方法都已解决时处理结果

var filesPromise = new Promise((resolve, reject) => {
    fs.readdir(ftpFolder, (err, files) => {
        if(err) reject(err)
        else resolve(files)
    })
})

var connectionPromise = new Promise((resolve, reject) => {
    c.on("ready", () => { resolve(c) }
    c.connect(connection.server_ftp)
})

Promise.all([filesPromise, connectionPromise], results => {
    results[0] // files
    results[1] // client
}).catch(err => {console.error(err)})

在我的例子中(非常类似),我将文件名而不是文件的完整路径放在
c.put
中。从你的代码来看,我认为是一样的