Node中的SFTP模块下载和删除文件

时间:2017-01-14 09:46:12

标签: node.js sftp

我的任务是(或更好,应该)简单:从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)如果我没有机会选择本地目录,那么这些文件很可能会被节点下载的地方下载,对吗?

那么,如果使用此模块(或其他任何模块)成功下载文件,我怎样才能获得实际下载并可能远程删除的文件?

谢谢, 法比奥

4 个答案:

答案 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)
  });
}