从 Node 上传多个文件到 SFTP
Upload multiple files to SFTP from Node
我正在尝试将多个文件上传到我的 SFTP 服务器,但没有成功。我看过这个例子:
how do I send (put) multiple files using nodejs ssh2-sftp-client?
但这似乎不是一种非常有效的方法,因为它会在每次上传文件时打开和关闭与服务器的连接。只是为了提供一些上下文,我的应用程序可能会尝试上传数千个文件。我正在从客户端向服务器发送一个文件名数组,并调用 SFTP.get 从远程位置获取文件,然后 SFTP.put 该文件流回到另一个远程位置。这是通过 ssh2-sftp-client npm 模块完成的。
我尝试使用几种不同的方法上传多个文件,但都失败了。
首先:
for (var i=0; i<10; i++) {
sftp.get('filepath/testFile.csv').then((stream) => {
sftp.put(stream, 'newfilepath/testFile' + i + '.csv');
})
}
这只是尝试获取同一个文件并每次以不同的文件名上传 10 次。但是,当我查看我的服务器时:
只上传了最后一个文件 - 查看日志时,它实际上只是尝试上传 testFile10.csv 10 次,而不是 testFile1.csv、testFile2.csv 等...
其次:
var files = ['testFile.csv', 'testFile2.csv']
for (var i=0; i<2; i++) {
sftp.get('filepath/' + files[i]).then((stream) => {
sftp.put(stream, 'newfilepath/testFile' + i + '.csv');
})
}
这是尝试简单地上传 2 个文件。但是,与上一个示例一样,只上传了最后一个文件 - 在本例中 testFile2.csv.
有什么建议可以使它正常工作吗?甚至可以在 for 循环中放置多个文件吗?这似乎不应该是技术上困难的事情我只是不明白为什么它甚至不尝试从 0 循环到 10 它只是试图将 testFile10 放置 10 次。
这是一个非常关键的技术障碍,我需要在截止日期前克服它,所以我非常感谢您能提供的任何帮助。
非常感谢,
G
因为异步回调在 promise 被解析时运行,在主执行顺序之外,当它运行时,i
已经等于数组的长度。因此它只上传最后一个文件。
所以你可以用 promises 来做,就像这样(我现在无法检查):
const files = ['testFile.csv', 'testFile2.csv'];
const promises = files.map(async file => {
const stream = await sftp.get(`filepath/${file}`);
sftp.put(stream, file);
});
Promise.all(promises)
.then(results => {
console.log('all files have been uploaded');
// do something
})
.catch(e => {
console.error(e);
// handle error
});
我正在尝试将多个文件上传到我的 SFTP 服务器,但没有成功。我看过这个例子:
how do I send (put) multiple files using nodejs ssh2-sftp-client?
但这似乎不是一种非常有效的方法,因为它会在每次上传文件时打开和关闭与服务器的连接。只是为了提供一些上下文,我的应用程序可能会尝试上传数千个文件。我正在从客户端向服务器发送一个文件名数组,并调用 SFTP.get 从远程位置获取文件,然后 SFTP.put 该文件流回到另一个远程位置。这是通过 ssh2-sftp-client npm 模块完成的。
我尝试使用几种不同的方法上传多个文件,但都失败了。
首先:
for (var i=0; i<10; i++) {
sftp.get('filepath/testFile.csv').then((stream) => {
sftp.put(stream, 'newfilepath/testFile' + i + '.csv');
})
}
这只是尝试获取同一个文件并每次以不同的文件名上传 10 次。但是,当我查看我的服务器时:
只上传了最后一个文件 - 查看日志时,它实际上只是尝试上传 testFile10.csv 10 次,而不是 testFile1.csv、testFile2.csv 等...
其次:
var files = ['testFile.csv', 'testFile2.csv']
for (var i=0; i<2; i++) {
sftp.get('filepath/' + files[i]).then((stream) => {
sftp.put(stream, 'newfilepath/testFile' + i + '.csv');
})
}
这是尝试简单地上传 2 个文件。但是,与上一个示例一样,只上传了最后一个文件 - 在本例中 testFile2.csv.
有什么建议可以使它正常工作吗?甚至可以在 for 循环中放置多个文件吗?这似乎不应该是技术上困难的事情我只是不明白为什么它甚至不尝试从 0 循环到 10 它只是试图将 testFile10 放置 10 次。
这是一个非常关键的技术障碍,我需要在截止日期前克服它,所以我非常感谢您能提供的任何帮助。
非常感谢,
G
因为异步回调在 promise 被解析时运行,在主执行顺序之外,当它运行时,i
已经等于数组的长度。因此它只上传最后一个文件。
所以你可以用 promises 来做,就像这样(我现在无法检查):
const files = ['testFile.csv', 'testFile2.csv'];
const promises = files.map(async file => {
const stream = await sftp.get(`filepath/${file}`);
sftp.put(stream, file);
});
Promise.all(promises)
.then(results => {
console.log('all files have been uploaded');
// do something
})
.catch(e => {
console.error(e);
// handle error
});