我正在尝试从 Node.js 应用程序中的远程 SFTP 服务器加载文件。我用 ssh2-sftp-client这个任务的库。不幸的是我有错误。我做错了什么?
当我使用这样的代码时,它会正确返回远程 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'))
现在我想在浏览器中返回文件作为响应。如何正确制作?
最佳答案
这是我最终的工作代码:
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');
});
});
关于javascript - 如何在 Node.js 中正确使用 ssh2-sftp-client 库的 fastGet 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54380202/