使用 NodeJS 将文件从 SFTP 流式传输到 SMB

问题描述 投票:0回答:1

我正在尝试使用 NodeJS 脚本将文件从 SFTP 服务器复制到 SMB 共享,但前提是文件的更新时间超过 3 天。我这里有代码的基本框架,但我在明显的地方绊倒了;从 SFTP 获取文件作为流,这样我就可以作为流写入 SMB。文件可能非常大,因此我想避免在下载/重新上传周期中使用本地存储。

const path = require('path');
const sftp = require('ssh2-sftp-client');
const smb2 = require('smb2');
const config = require('./config');

function extractTimestamp(filename) {...} // works fine
function calculateAgeFromTimestamp(timestamp) {...} // also works fine

async function processFiles() {
  const sftpClient = new sftp();
  const smbClient = new smb2(config.smb);

  try {
    await sftp.connect(config.sftp);
    console.log(`Listing remote SFTP source: ${config.sourceDir}`);
    const files = await sftp.list(config.sourceDir);

    if (files.length === 0) {
      console.log('No files found on SFTP.');
      return;
    }

    for (const file of files) {
      const sourceFilePath = path.join(config.sourceDir, file.name);
      const destinationFilePath = config.smb.share + '\\' + file.name;

      const timestamp = extractTimestamp(file.name);
      const fileAgeDays = calculateAgeFromTimestamp(timestamp);

      if (fileAgeDays <= 3) {
        const exists = await new Promise((resolve, reject) => {
          smbClient.exists(destinationFilePath, (err, exists) => {
            if (err) {
              console.error('Error checking file existence on SMB:', err);
              reject(err);
            } else {
              resolve(exists);
            }
          });
        });

        if (!exists) {
          console.log('Found file to copy');

          // !!!confusing stream code goes here
         
        } else {
          console.log('File already exists');
        }
      }
    }
  } catch (error) {
    console.error('Error:', error);
  } finally {
    sftp.end();
    smbClient.close();
  }
}

processFiles();

我可以使用某种包装器将 SFTP 的读取内容转换为流吗?

node.js stream sftp smb
1个回答
0
投票

我无法使用上面的代码连接到 smb 共享。访问被拒绝。有什么帮助吗

© www.soinside.com 2019 - 2024. All rights reserved.