我正在尝试使用 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);
}
}
此解决方案有效,但对于大文件感觉不是很有效。有没有更好的方法来实现这一点?也许使用流而不必使用循环?