Tôi gặp sự cố khá lạ khi làm việc với luồng đọc trong Node.js. Tôi đang sử dụng SSH2 để tạo ra một kết nối sftp giữa tôi và một máy chủ sftp. Sau đó tôi cố gắng tạo luồng đọc từ luồng sftp. Từ sự kiện 'dữ liệu' được phát ra của luồng đọc, tôi nối dữ liệu vào một mảng. Khi sự kiện 'close' của dòng đọc xảy ra, tôi thực hiện cuộc gọi đến Buffer.concat để tạo ra concat tất cả các khối dữ liệu mà tôi đã truy xuất vào một bộ đệm. Đây là kỹ thuật tương tự được mô tả trong các câu hỏi khác được hỏi ở đây tại tràn ngăn xếp. Ví dụ: here. Tuy nhiên, tôi không thể sử dụng dữ liệu tôi truy xuất. Dường như bộ đệm có kích thước nhỏ hơn 32 byte thì tệp tôi đang cố gắng truy xuất (tính thời lượng dữ liệu được truy lục). Điều này có liên quan gì đến kết nối SFTP của tôi không? Hoặc cách tôi tạo luồng đọc của mình?Đọc tệp từ máy chủ SFTP bằng Node.js và SSH2
Nếu có vấn đề, tệp thuộc loại zip. Khi tôi cố gắng giải nén tập tin (trong node.js và thủ công) sau khi đọc nó để đệm nó không hoạt động.
Sau khi điều tra tôi đã phát hiện ra rằng:
- Khi tôi sử dụng readdir vào file, kích thước của tập tin là đúng.
- Sử dụng FTP (JSFTP) để phát triển máy chủ FTP của tôi hoạt động tốt bằng cách sử dụng kỹ thuật tương tự ở trên.
Bất kỳ lời khuyên nào được đánh giá cao!
Đây là mã của tôi:
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);
vấn đề của sftp.fastGet/fastTải xuống là nó không cung cấp chức năng tạm dừng, nhưng luồng có thể. –