2016-11-29 2 views
0

node.js.를 사용하여 큰 이미지 (~ 2MB 이상)를 다운로드하는 방법을 찾으려고합니다. 나는 모든 종류의 솔루션을 시도하면서 높고 낮은 것을 검색했으며 이미지가 다운로드 되더라도 일부는 지속적으로 손상되었습니다.Node.js 다운로드 한 이미지가 손상됨

예를 들어 다음 코드를 사용하여이 샘플 이미지를 다운로드해도 이미지는 절반 만 다운로드됩니다.

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'); 

I도하지만 동일한 결과

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); 

내가 Node.js를의 v4.2.6로 우분투 v16.04 가상 머신을 사용하고 받고 있어요 NPM의 이미지 다운 로더를 사용하여 시도했다 .

-UPDATE-

는 & 의견은 아래의 (지금 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)

request({url: options.url, encoding: null, forever:true}, function (err, response, body) { 

에 이미지 download.js 파일의 요청 : {사실 영원히} 나는 추가했다.

+0

이미지 데이터를 모두 작성하고 쓰는 대신 데이터 수신시 파일에 쓰려고 했습니까? –

+0

업데이트 된 코드가 유용합니다. 다운로드 한 파일은 106045 바이트 여야합니다. 너 그거 보니? – tcooc

+0

@tcooc 때로는 ~ 60KB, 가끔 ~ 53KB, 때로는 "ECONNRESET"이 나옵니다. 아직 전체 파일을 다운로드 할 수 없었습니다. 내 node.js 설정에 내가보고 있어야하는 것이 있습니까? –

답변

1

이진 데이터를 받고 있지만 문자열에 추가하고 있습니다.

당신이해야 할 일은 버퍼 작업입니다. 당신이 버퍼 추가 방법은 다음과 같습니다

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); 
}); 

는 또한 request 같은 높은 수준의 API를 사용 :이 같은 플러스 일부 오류 검사 및 로깅을 할 수 있습니다.

물론 속도 제한이나 다른 이용 약관을 초과하여 서버가 요청에 불완전하거나 유효하지 않은 응답을 줄 가능성은 배제 할 수 없습니다.

+0

아마도'fs.createWriteStream'을위한 좋은 유스 케이스 일 것입니다. –

+0

@StevenSchobert 좋은 지적. 나는 대답에 그것을 덧붙였다. 감사. – rsp

+0

이미지 다운로더가 이미 https://github.com/demsking/image-downloader/blob/master/index.js 요청을 사용하고 있지만 fs.createWriteStream을 사용하지 않는 것 같습니다. –

관련 문제