node.js - 使用 Node 和 SSH2 将缓冲区数据写入 SFTP 服务器
问题描述
我正在尝试使用 SSH2 模块将文件写入 Node 中的 SFTP 服务器。对于我的用例,文件源是 Azure Blob 存储,文件相对较大(超过 5 个 gig),因此想法是从块存储中捕获数据并将其写入服务器。不想下载整个文件然后执行写入,因为文件很大并且不想在运行时出现磁盘空间问题。
我通过使用可用的 downloadToBuffer() 和 write() 函数并增加“偏移量”直到所有字节都被写入,从而实现了这一点。如代码片段所示
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);
}
}
此解决方案有效,但对于大文件感觉不是很有效。有没有更好的方法来实现这一点?也许使用流而不必使用循环?
解决方案
关于这个问题,请参考以下代码
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");
});
推荐阅读
- azure - 无法在 Azure 中使用 ServicePrincipal 凭据获取应用程序
- java - 将字符串值设置为 MPAndroidChart 条形图的 xaxis 标签
- c# - 无法加载文件或程序集“Microsoft.Build.Utilities.Core,版本=14.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”
- c++ - C++:如何使我的计算程序的每个答案都对齐?
- javascript - 什么样的 JS 数据结构内部代表?
- c# - Httpclient 下载时获取实时下载速度
- powershell - 如何在 powershell 中传输 ETX 命令?
- runtime-error - [15896] ReportWifiNetworkData.exe 中出现未处理的异常('System.BadImageFormatException')
- java - 嗨,我想用 thyleaf 填充选择的 html 并出现错误
- r - POSIXct 从 12 小时时间戳中去除秒数