2016-09-02 66 views
0

我確定我錯過了一些明顯的問題,但問題的要點是我收到一個來自Mapbox調用的PNG,意圖寫它到文件系統並將其提供給客戶端。我已經成功地轉播了這個電話,收到了原始數據的回覆並且寫了一個文件。問題是無論我採取什麼方式,我的文件都會被截斷,我已經用盡了我找到的答案。我已經將原始響應放到了日誌中,並且它很健壯,但是我創建的任何文件都傾向於關於塊的值不可讀的數據。寫一個圖像到文件,通過節點上的HTTP請求接收

下面是我目前在文件製作中使用的代碼。在幾次失敗和可比較的無果循環之後,我嘗試將這個緩衝移動作爲最後的一步。任何幫助將不勝感激。

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或讀取塊和文件類型模塊中所說的那樣。

+0

++在這個答案。完美的修復。謝謝。 –

相關問題