从FTP上下载文件问题(Nodejs相关)

从FTP上下载文件问题(Nodejs相关)

c.on(‘ready’, function () {
console.log(‘ready’);
c.get(’/pub/seg/pac/chkrootkit.tar.gz’,function(err,stream){
if(err){
console.log(“error”);
}else{
stream.once(“close”,function(){
c.end();
});
var writable = fs.createWriteStream(‘chkrootkit.tar.gz’,‘a’);
stream.pipe(writable);
}

    });
    
});

这段代码一开始运行成功了,但是我把对应文件删除后重新下载的话又会报错:

	stream.js:94
      throw er; // Unhandled stream error in pipe.
            ^
Error: EACCES, open 'chkrootkit.tar.gz'

新人求指导


3 回复

针对您在从FTP服务器下载文件时遇到的权限问题,我们可以对现有的代码进行一些改进。主要的问题在于当文件已经存在时,使用 'a'(追加模式)打开文件可能会导致权限错误。我们可以通过检查文件是否存在来决定以何种模式打开文件。

下面是改进后的代码示例:

const fs = require('fs');
const ftp = require('basic-ftp');

// 创建一个FTP客户端实例
const client = new ftp.Client();

client.ftp.verbose = true; // 启用详细的日志输出

async function downloadFile() {
    try {
        await client.access({
            host: "your_ftp_host",
            user: "your_username",
            password: "your_password"
        });

        console.log('FTP连接成功');

        const remoteFilePath = '/pub/seg/pac/chkrootkit.tar.gz';
        const localFilePath = './chkrootkit.tar.gz';

        // 检查本地文件是否存在
        const exists = fs.existsSync(localFilePath);

        // 打开写入流,根据文件是否已存在选择写入模式
        const writable = fs.createWriteStream(localFilePath, { flags: exists ? 'a' : 'w' });

        // 下载文件
        await client.downloadTo(writable, remoteFilePath);

        console.log('文件下载完成');

        writable.close(); // 关闭写入流
    } catch (err) {
        console.log(err);
    } finally {
        client.close();
    }
}

downloadFile();

代码解析:

  1. 创建FTP客户端:使用 basic-ftp 库创建一个FTP客户端实例。
  2. 连接到FTP服务器:通过调用 client.access 方法并传入FTP服务器的相关信息来建立连接。
  3. 检查文件是否存在:使用 fs.existsSync 方法检查本地文件是否已经存在。
  4. 创建写入流:根据文件是否已存在,选择合适的写入模式('w' 表示覆盖写入,'a' 表示追加写入)。
  5. 下载文件:调用 client.downloadTo 方法将远程文件下载到本地。
  6. 关闭资源:在下载完成后关闭写入流,并确保在任何情况下都关闭FTP连接。

这样可以避免因文件已存在而尝试以追加模式打开文件时出现的权限问题。希望这能解决您的问题!


自己回帖。。。 已经解决,发现var writable = fs.createWriteStream(‘chkrootkit.tar.gz’,‘a’); 文件路径需为绝对路径,如/home/usr/chkrootkit.tar.gz

根据你的描述,错误信息 EACCES, open 'chkrootkit.tar.gz' 表示你尝试打开一个文件时遇到了权限问题。这通常是因为文件正在被其他程序使用或文件权限设置不正确。

为了解决这个问题,你可以尝试以下几个方法:

  1. 确保文件没有被其他程序占用:确认没有其他进程正在使用 chkrootkit.tar.gz 文件。
  2. 更改文件写入模式:你可以将文件写入模式从 'a' 改为 'w' 或默认模式。'a' 模式表示追加到文件末尾,而 'w' 表示覆盖已存在的文件或创建新文件。

以下是修改后的示例代码:

const fs = require('fs');
const c = require('ssh2-sftp-client'); // 假设你使用的是 ssh2-sftp-client 库

c.connect({
  host: 'your_ftp_host',
  port: 22,
  username: 'your_username',
  password: 'your_password'
}).then(() => {
  return c.get('/pub/seg/pac/chkrootkit.tar.gz', 'chkrootkit.tar.gz');
}).then((data) => {
  console.log('File downloaded successfully.');
}).catch((err) => {
  console.error('Error:', err);
}).finally(() => {
  c.end();
});

在这个示例中,我们使用了 ssh2-sftp-client 库来简化 FTP 下载操作。你可以通过 npm 安装该库:

npm install ssh2-sftp-client

这样可以避免手动处理流,并且会自动处理文件的创建和写入操作。

回到顶部