Mam dość dziwny problem ze strumieniami odczytu w pliku Node.js. Używam SSH2 do utworzenia połączenia sftp między mną a serwerem sftp. Następnie próbuję utworzyć strumień odczytu ze strumienia sftp. Z emitowanego zdarzenia "data" strumienia odczytu dołączam dane do tablicy. Kiedy wystąpi zdarzenie "zamknij" strumienia odczytu, wykonuję wywołanie Buffer.concat, aby utworzyć wszystkie fragmenty danych, które pobrałem do jednego bufora. Jest to ta sama technika opisana w innych pytaniach zadawanych tutaj przy przepełnieniu stosu. Na przykład here. Jednak nie mogę użyć danych, które pobieram. Wygląda na to, że bufor ma rozmiar o 32 bajty mniejszy niż plik, który próbuję pobrać (od zliczania długości pobieranych danych). Czy to może mieć coś wspólnego z moim połączeniem SFTP? Albo w jaki sposób mogę utworzyć strumień do odczytu?Czytanie pliku z serwera SFTP przy użyciu Node.js i SSH2
Jeśli to ważne, plik jest typu zip. Kiedy próbuję rozpakować plik (w pliku node.js i ręcznie) po odczytaniu go do bufora, nie działa.
Po zbadaniu znalazłem, że:
- Gdy używam readdir na pliku, rozmiar pliku jest poprawna.
- Używanie FTP (JSFTP) przeciwko mojemu rozwojowi Serwer FTP działa dobrze, używając tej samej techniki powyżej.
Każda rada jest doceniana!
Oto mój kod:
var Client = require('ssh2').Client;
var m_ssh2Credentials = {
host: config.ftpHostName,
port: config.ftpPort,
username: config.ftpUser,
password: config.ftpPassword,
readyTimeout: 20000,
algorithms: { cipher: ["3des-cbc", "aes256-cbc", "aes192-cbc","aes128-cbc"]}
};
...
var conn = new Client();
var dataLength = 0;
conn.on('ready', function() {
conn.sftp(function(err, sftp) {
if (err) {
writeToErrorLog("downloadFile(): Failed to open SFTP connection.");
} else {
writeToLog("downloadFile(): Opened SFTP connection.");
}
var streamErr = "";
var dataLength = 0;
var stream = sftp.createReadStream(config.ftpPath + "/" + m_fileName)
stream.on('data', function(d){
data.push(d);
dataLength += d.length;
});
.on('error', function(e){
streamErr = e;
})
.on('close', function(){
if(streamErr) {
writeToErrorLog("downloadFile(): Error retrieving the file: " + streamErr);
} else {
writeToLog("downloadFile(): No error using read stream.");
m_fileBuffer = Buffer.concat(data, dataLength);
writeToLog("Data length: " + dataLength);
writeToLog("downloadFile(): File saved to buffer.");
}
conn.end();
});
})
})
.on('error', function(err) {
writeToErrorLog("downloadFile(): Error connecting: " + err);
}).connect(m_ssh2Credentials);
Problem sftp.fastGet/fastDownload jest taki, że nie zapewnia funkcji pauzy, ale strumień może. –