我正在尝试编写一个应用程序,使用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"。它似乎已将文件的名称写入文件而不是上传。任何指导将不胜感激!
答案 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
中。从您的代码中,我认为它是相同的。