노드

2016-09-02 4 views
0

의 HTTP 요청을 통해 수신 된 파일에 이미지 쓰기 확실한 것은 분명하지 않지만 문제의 요지는 맵box 호출에서 PNG를 수신 의도로 작성한 것입니다. 파일 시스템에 저장하고 클라이언트에 제공합니다. 성공적으로 전화를 중계하고 원시 데이터 응답을 수신하고 파일을 작성했습니다. 문제는 필자가 어떤 경로를 취했는지에 상관없이 파일이 잘린 상태로 끝나고 피사체를 치우는 답변을 모두 소진 한 것입니다. 원시 응답을 로그에 버렸습니다. 강력하지만, 작성한 모든 파일은 읽을 수없는 데이터의 상당 부분을 차지하는 경향이 있습니다.노드

다음은 파일 작성을위한 코드입니다. 몇 번 실패하고 거의 성공하지 못했던 마지막 시도로이 버퍼 이동을 시도했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

module.exports = function(req, res, cb) { 
    var cartography = function() { 
     return https.get({ 
      hostname: 'api.mapbox.com', 
      path: '/v4/mapbox.wheatpaste/' + req.body[0] + ',' + req.body[1] + ',6/750x350.png?access_token=' + process.env.MAPBOX_API 
     }, function(res) { 
      var body = ''; 
      res.on('data', function(chunk) { 
       body += chunk; 
      }); 
      res.on('end', function() { 
       var mapPath = 'map' + req.body[0] + req.body[1] + '.png'; 
       var map = new Buffer(body, 'base64'); 
       fs.writeFile(__dirname + '/client/images/maps/' + mapPath, map, 'base64', function(err) { 
        if (err) throw err; 
        cb(mapPath); 
       }) 
      }) 
     }); 
    }; 
    cartography(); 
}; 
+0

내가 잘못보고 "고객에게 제공"이라고 말했습니다. 이 경우에는 파일을 쓰는 것이 더 정확합니다. 반환 된 응답은 생성 된 파일의 이름입니다. –

답변

0

더 컴팩트 한 서브 루틴에 코드를 다시 작성할 수 있습니다 :

const fs = require('fs'); 
    const https = require('https'); 

    https.get(url, (response)=> { //request itself 
     if(response) { 
      let imageName = 'image.png'; // for this purpose I usually use crypto 
      response.pipe(//pipe response to a write stream (file) 
       fs.createWriteStream(//create write stream 
        './public/' + imageName //create a file with name image.png 
       ) 
      ); 
      return imageName; //if public folder is set as default in app.js 
     } else { 
      return false; 
     } 
    }) 

당신은 원래의 이름과 URL에서 확장자를 얻을 수 있지만, 더 안전한 암호와 새 이름을 생성하고 파일 확장자를 얻을 수 내가 url이나 read-chunk와 file-type 모듈로 말했던 것처럼.

+0

++이 대답. 완벽한 수정. 고맙습니다. –