【问题标题】:Write buffer data to SFTP server using Node and SSH2使用 Node 和 SSH2 将缓冲区数据写入 SFTP 服务器
【发布时间】:2021-04-29 07:22:12
【问题描述】:

我正在尝试使用 SSH2 模块将文件写入 Node 中的 SFTP 服务器。对于我的用例,文件源是 Azure Blob 存储,文件相对较大(超过 5 个 gig),因此想法是从块存储中捕获数据并将其写入服务器。不希望下载整个文件然后执行写入,因为文件很大并且不希望在运行时出现磁盘空间问题。

我通过使用可用的 downloadToBuffer() 和 write() 函数并增加“偏移量”直到所有字节都被写入,从而实现了这一点。如代码sn-p中所见

sftp.open('remoteFilePath','w', async (openError,handle) => {
  if (openError) throw openError;
  var blobOffset=0;
  try{
    while(blobOffset<file.size){
      await client.downloadToBuffer(blobOffset, blobOffset+ length > file.size? file.size - blobOffset: length).then((buffer) => {
        sftp.write(handle,buffer,0,blobOffset + length > file.size? buffer.length:length, blobOffset, (writeError)=>{if(writeError) throw writeError});
      });
      blobOffset += length;
    }
  }
  catch(e){
    console.log(e);
  }
}

此解决方案有效,但对于大文件感觉不是很有效。有没有更好的方法来实现这一点?也许使用流而不必使用循环?

【问题讨论】:

    标签: node.js sftp azure-blob-storage ssh2-sftp ssh2-sftp-client


    【解决方案1】:

    关于问题,请参考以下代码

    var Client = require("ssh2").Client;
    var {
      BlobServiceClient,
      StorageSharedKeyCredential,
    } = require("@azure/storage-blob");
    
    var accountName = "andyprivate";
      var accountKey =
        "";
      var creds = new StorageSharedKeyCredential(accountName, accountKey);
      var blobServiceClient = new BlobServiceClient(
        `https://${accountName}.blob.core.windows.net`,
        creds
      );
      var containerClient = blobServiceClient.getContainerClient("output");
      let blob = containerClient.getBlockBlobClient("5m Sales Records.csv");
      let read = (await blob.download(0)).readableStreamBody;
      var conn = new Client();
    
      conn.connect({
        host: "",
        port: 22,
        username: "",
        password: "!",
      });
    
      conn.on("ready", async () => {
        conn.sftp((err, sftp) => {
          if (err) throw err;
          var write = sftp.createWriteStream("/home/testqw/test.csv");
    
          read.pipe(write);
          write
            .on("error", function (error) {
              throw error;
            })
            .on("finish", () => {
              console.log("All writes are now complete.");
              sftp.end();
            });
        });
      });
      conn.on("end", () => {
        console.log("close the connection");
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 2016-09-19
      • 2015-06-11
      • 2011-08-22
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多