Я пытаюсь реализовать запись файлов на SFTP-сервер в узле с помощью модуля SSH2. В моем случае источником файлов является хранилище BLOB-объектов Azure, а файлы относительно велики (более 5 гигабайт), поэтому идея состоит в том, чтобы собирать данные из хранилища BLOB-объектов по частям и записывать их на сервер. Не нужно загружать весь файл, а затем выполнять запись, так как файлы большие и не хотят иметь проблемы с дисковым пространством во время выполнения.
У меня есть рабочая реализация этого, используя доступные функции 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);
}
}
Это решение работает, но не очень эффективно для больших файлов. Есть ли лучший способ реализовать это? Может быть, использовать потоки и не использовать циклы?