我的任务是(或更好,应该)简单:从Node应用程序获取SFTP中目录的内容,然后下载其中的所有文件,最后远程删除它们。
现在,我检查了不同的模块。在我看来,很干净的是ssh2-sftp-client。我可以这样使用它:
use Illuminate\Http\Request;
use Cookie;
public function addtocart(Request $request) {
Cookie::queue('id', Session::getId(), 50000);
}
public function cart(Request $request)
{
$condn = $request->cookie('id');
}
我可以列出所有文件并在控制台中查看生成的jSon,但.get命令似乎什么都不做,我不知道出了什么问题。从文档(https://www.npmjs.com/package/ssh2-sftp-client),您可以像我正在做的那样获取文件。但是:
1)它似乎不起作用 2)我该如何调试正在进行的操作? 3)如果我没有机会选择本地目录,那么这些文件很可能会被节点下载的地方下载,对吗?
那么,如果使用此模块(或其他任何模块)成功下载文件,我怎样才能获得实际下载并可能远程删除的文件?
谢谢, 法比奥
答案 0 :(得分:4)
sftp.get()
返回一个返回流的Promise,因此如果要将流保存到磁盘,则需要管道它。例如:
var fs = require('fs');
// ...
for(var i = 0; i < data.length; i++) {
const remoteFilename = '/path/to/remote/files/' + data[i].name;
const localFilename = '/path/to/local/files/' + data[i].name;
sftp.get(remoteFilename).then((stream) => {
stream.pipe(fs.createWriteStream(localFilename));
});
}
此外,似乎ssh2-sftp-client
未使用ssh2
模块的最新版本分支(截至撰写本文时为v0.5.x),因此如果遇到问题请记住这一点
答案 1 :(得分:1)
sftp.get(remoteFileNameWithPath, true).then(stream => {
stream.pipe(fs.createWriteStream(localFilePath)).on('close', () => console.log('completely passed file'))
})
get方法返回带有流结果的promise,因此,为了保存它,你需要管道到writeStream 检查nodejs上的文档:https://nodejs.org/api/stream.html
答案 2 :(得分:0)
使用get()方法下载并保存文件
sftp.get(remote_file_path, local_file_path).then((stream) => {
console.log('File download Success')
});
它需要两个参数:src和dest文件路径
答案 3 :(得分:-1)
我不确定会发生什么,但是当我运行这样的代码时,它只会下载一个文件。
for (var i = fileList.length - 1; i >= 0; i--) {
remoteFilename = process.env.FTP_DEFAULT_DIR + '/' + fileList[i].name
localFilename = fileList[i].name
sftp.get(remoteFilename).then((stream) => {
stream.pipe(fs.createWriteStream(localFilename));
console.log(stream);
console.log('processing: ', remoteFilename);
}).catch((err)=> {
console.log(err)
});
}