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

时间:2018-02-14 17:29:15

标签: 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/";

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"。它似乎已将文件的名称写入文件而不是上传。任何指导将不胜感激!

2 个答案:

答案 0 :(得分:0)

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

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

const path = require('path')
let filePath = path.join(ftpFolder, file)
let fileContents = fs.readFile(path, 'utf8', (err, data) => {
    // do the upload
})

作为附注...当您的目录读取可能有效时,您应该考虑在建立连接后读取目录。否则,您可能会看到它失败,因为它是客户端连接和目录读取之间的竞争条件。您可能需要读取包含许多文件的目录,以便在客户端连接后解析它。

您可以嵌套回调,但处理此问题的另一种方法是Promises。您可以同时启动两种异步方法,并在两者都已解决时处理结果

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)})

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

答案 1 :(得分:0)

在非常相似的情况下,我将文件名而不是文件的完整路径放在c.put中。从您的代码中,我认为它是相同的。