当前位置: 首页 > 知识库问答 >
问题:

如何在Node.js?中正确使用ssh2-sftp-Client库的快速获取方法

淳于凯
2023-03-14

我正在尝试从节点中的远程SFTP服务器加载文件。js应用程序。我使用ssh2 sftp客户端库来完成此任务。不幸的是,我犯了错误。我做错了什么?

当我使用这样的代码时,它会正确地返回远程SFTP服务器路径中所有文件的列表。

router.get('/', (req, res) => {
  sftp.connect(config.sftpServer).then(() => {
    return sftp.list('/reports')
  }).then((data) => {
    console.log(data)
  }).catch((error) => {
    console.log(error)
  })
})

在控制台中,我看到这样的结果:

[ { type: '-',
    name: '1548244803285.csv',
    size: 74589,
    modifyTime: 1548278757000,
    accessTime: 1548513471000,
    rights: { user: 'rwx', group: 'rwx', other: 'rwx' },
    owner: 1030,
    group: 1022 } ]

如果我尝试使用fastGet方法下载特定文件,请单击Node。js引发错误。

return sftp.fastGet('/reports/1548244803285.csv', path.join(process.env.HOME || process.env.USERPROFILE, 'downloads/'))

错误:

Error: Failed to get /reports/NNogerbek1548244803285.csv: EISDIR: illegal operation on a directory, open 'C:\Users\NNogerbek\downloads'
    at C:\Users\NNogerbek\WebstormProject\web-app\node_modules\ssh2-sftp-client\src\index.js:192:16
    at cbfinal (C:\Users\NNogerbek\WebstormProject\web-app\node_modules\ssh2-streams\lib\sftp.js:1038:11)
    at SFTPStream._transform (C:\Users\NNogerbek\WebstormProject\web-app\node_modules\ssh2-streams\lib\sftp.js:389:17)
    at SFTPStream.Transform._read (_stream_transform.js:190:10)
    at SFTPStream._read (C:\Users\NNogerbek\WebstormProject\web-app\node_modules\ssh2-streams\lib\sftp.js:183:15)
    at SFTPStream.Transform._write (_stream_transform.js:178:12)
    at doWrite (_stream_writable.js:410:12)
    at writeOrBuffer (_stream_writable.js:394:5)
    at SFTPStream.Writable.write (_stream_writable.js:294:11)
    at Channel.ondata (_stream_readable.js:666:20)

我用来连接到remore SFTP服务器的用户有权读取、写入。不明白有什么问题。

嗯,我终于找到了问题的原因EISDIR表示应用程序试图对文件执行某些操作,但它是一个目录。

正确的代码是:

return sftp.fastGet('/reports/1548244803285.csv', path.join(process.env.HOME || process.env.USERPROFILE, 'downloads/1548244803285.csv'))

现在我想返回浏览器中的文件作为响应。如何正确制作?

共有1个答案

龚彬
2023-03-14

这是我最后的工作代码:

router.post('/', (req, res) => {
    const fileName = req.body.file_name;

    const remotePath = '/put_your_path_here/' + fileName;

    const localePath = path.join(process.env.HOME || process.env.USERPROFILE, 'Downloads/' + fileName);

    sftp.connect(config.sftpServer, 'once').then(() => {
        sftp.fastGet(remotePath, localePath, {}).then(() => {
            res.header('Content-type', 'text/csv; charset=windows-1251');
            res.sendFile(localePath);
            sftp.end();
        }).catch((err) => {
            sftp.end();
            console.log(err, 'fastGet method error');
        })
    }).catch((err) => {
        sftp.end();
        console.log(err, 'connect method error');
    });
});
 类似资料:
  • 问题内容: 我是一个Node.js新手,并且正在用它创建我的第一个大型应用程序(我正在使用Express)。当用户使用get请求加载ID时,我需要让我的网页执行一些javascript画布绘制 我知道我可以用一个简单的方法来处理 但我不知道如何使用该ID的要求的图纸开始我的网页。互联网上Express和Get上的每个教程都说明了如何处理get请求…这个问题是关于“接下来会发生什么?” 改写:我不确

  • 问题内容: 我一直在尝试在Node.js中调用D3。我首先尝试使用脚本标签从D3的网站导入d3.v2.js D3的作者建议一个人应该“ npm install d3” …我做到了,我可以在节点控制台中成功调用它: 但是,当尝试使用“ node app.js”从app.js调用它时,我得到: 我意识到,D3的作者在其他地方已经明确规定了应该使用画布: https://github.com/mbost

  • 问题内容: 我正在尝试编写一个nodejs服务器,该服务器将花费一个时间输入(可能是url路径的一部分),然后在该时间索引处以jpeg图片的形式提供静止的视频帧。 我可以用普通的Javascript轻松地做到这一点,但是我看不到在nodejs中做到这一点的方法。我知道我可能需要使用像node- canvas这样的画布插件来做快照。 任何想法欢迎。 以下是我目前在Javascript中的处理方式:

  • 问题内容: 在Objective-c中,我们可以像这样对字符串进行哈希处理: 但是CC_MD5在Swift中不起作用。我们该如何处理? 问题答案: 这就是我想出的。它是String的扩展。不要忘了添加到Xcode创建的ObjC-Swift桥接头中。

  • 问题内容: 我想将一些div转换为PDF,并且尝试了jsPDF库,但没有成功。看来我不明白我需要导入什么才能使库正常工作。我已经看过这些示例,但仍然无法弄清楚。我尝试了以下方法: 在jQuery之后: 用于测试目的,但我收到: 身体的第一个div 在哪里。 问题答案: 您可以按如下方式使用html中的pdf, 步骤1:将以下脚本添加到标题 步骤2:添加HTML脚本以执行jsPDF代码 对此进行自定

  • 问题内容: 我如何获得本地IpAddress? 当我使用该功能时,我将无法再继续使用。我不能使用该功能。 是否有其他方法可以执行此操作,或者我是否以错误的方式进行操作? 问题答案: 在讨论中发现,OP需要Mac上的接口地址,而不是我最初想的那样在iOS设备上。问题中引用的代码将检查接口名称“en0”,它是iPhone上的WiFi接口。在Mac上,改为检查任何“正在运行”的界面更有意义。因此,我重写