[英]Node.js downloaded images corrupted
我正在嘗試找到一種使用node.js下載大圖像(〜2MB及以上)的方法。 我搜索過很多東西,嘗試了各種解決方案,即使下載了圖像,某些圖像也始終損壞。
例如,可以使用以下代碼下載此示例圖像,但是該圖像僅下載了一半。
var http = require('http')
var fs = require('fs')
var options = {
host:'images.clipartpanda.com',
port:80,
path:'http://images.clipartpanda.com/writing-clip-art-xTgn7KXTA.jpeg'
};
var downloadImage = function (options, fileName) {
http.get(options, function (res) {
var imageData = '';
res.setEncoding('binary');
res.on('data', function (chunk) {
imageData += chunk;
});
res.on('end', function () {
fs.writeFile(fileName, imageData, 'binary', function(err){
if(err) throw err;
console.log('File: ' + fileName + " written!");
})
});
});
};
downloadImage(options,'writing-clip-art-xTgn7KXTA.jpeg');
我也嘗試使用npm image-downloader,但得到的結果相同
var image_downloader = require('image-downloader');
var options = {
url: 'http://images.clipartpanda.com/writing-clip-art-xTgn7KXTA.jpeg',
dest: '/home',
done: function (err, filename, image) {
if (err) {
console.log(err);
} else {
console.log('File saved to', filename);
}
},
};
image_downloader(options);
我正在將Ubuntu v16.04虛擬機與Node.js v4.2.6配合使用。
-更新-
按照下面的答案和注釋嘗試使用以下代碼(現在使用createWriteStream),但下載時文件仍然損壞。
var http = require('http')
var fs = require('fs')
var options = {
host:'images.clipartpanda.com',
port:80,
path:'http://images.clipartpanda.com/writing-clip-art-xTgn7KXTA.jpeg'
};
var fileName = 'writing-clip-art-xTgn7KXTA.jpeg';
http.get(options, function (res) {
var stream = fs.createWriteStream(fileName);
res.pipe(stream);
});
有時我還會收到這樣的錯誤:
Command: node "/home/test.js"
events.js:141
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET
at exports._errnoException (util.js:870:11)
at TCP.onread (net.js:544:26)
Program exited with code 1
-更新2-
在尋找了無數小時來解決此問題之后,我想我已經解決了。 我必須在第21行的image-download.js文件中的請求中添加{forever:true}。
request({url: options.url, encoding: null, forever:true}, function (err, response, body) {
似乎套接字連接不斷消失,需要使用keepAlive:true。
您正在獲取二進制數據,但是將其附加到字符串。
您應該做的是在緩沖區上工作。 這是添加緩沖區的方法:
var newBuffer = Buffer.concat([buffer1, buffer2]);
因此,不要將數據附加到字符串,而是將每個緩沖區添加到數組,並使用Buffer.concat在末尾連接所有緩沖區。 請參閱: Buffer.concat()
。
甚至更好-您可以使用流(感謝Steven Schobert在評論中指出)。 您可以執行以下操作以及一些錯誤檢查和日志記錄:
http.get(options, function (res) {
var stream = fs.createWriteStream(fileName);
res.pipe(stream);
});
或者使用更高級別的API,例如request
。
當然,您不能排除由於超出某些速率限制或其他使用條款而導致服務器對您的請求給出不完整或無效響應的可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.