Ich habe ein ziemlich seltsames Problem mit Lese-Streams in Node.js arbeiten. Ich verwende SSH2, um eine sftp-Verbindung zwischen mir und einem sftp-Server zu erstellen. Ich versuche dann einen Lese-Stream aus dem SFTP-Stream zu erstellen. Aus dem vom Datenstrom ausgesendeten Ereignis 'Daten' füge ich die Daten an ein Array an. Wenn das Ereignis "Schließen" des Lesestroms auftritt, rufe ich Buffer.concat auf, um concat alle Datenblöcke zu erstellen, die ich in einen Puffer abgerufen habe. Dies ist die gleiche Technik, die in anderen Fragen beschrieben wurde, die hier beim Stapelüberlauf gestellt wurden. Zum Beispiel here. Ich kann die Daten, die ich erhalte, jedoch nicht verwenden. Es sieht so aus, als ob der Puffer 32 Bytes weniger groß ist als die Datei, die ich abzurufen versuche (indem ich die Länge der abgerufenen Daten zähle). Könnte das etwas mit meiner SFTP-Verbindung zu tun haben? Oder wie erstelle ich meinen Lesestream?Lesen von Datei von SFTP-Server mit Node.js und SSH2
Wenn es darauf ankommt, ist die Datei vom Typ zip. Wenn ich versuche, die Datei zu entpacken (in node.js und manuell), nachdem ich sie in den Puffer gelesen habe, funktioniert sie nicht.
Nach der Untersuchung habe ich herausgefunden, dass:
- Wenn ich readdir auf die Datei verwenden, die Größe der Datei korrekt ist.
- Die Verwendung von FTP (JSFTP) gegen meine Entwicklung FTP-Server funktioniert gut mit der gleichen Technik oben.
Jede Beratung wird geschätzt!
Hier ist mein Code:
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);
das Problem von sftp.fastGet/fastDownload ist, dass es keine Pause-Funktion bieten, sondern Stream kann. –