2015-07-08 5 views
7

में कोई पाइप नहीं है, मैं इसे बिना किसी पाइप के छवि को डाउनलोड करने में सफल होने के लिए संघर्ष कर रहा हूं। यहाँ मैं क्या पूरा किया है है:नोड-अनुरोध का उपयोग करके एक छवि डाउनलोड करें, और एफएस प्रोमोसिफाइड, नोड.जेएस

var Promise = require('bluebird'), 
    fs = Promise.promisifyAll(require('fs')), 
    requestAsync = Promise.promisify(require('request')); 

function downloadImage(uri, filename){ 
    return requestAsync(uri) 
     .spread(function (response, body) { 
      if (response.statusCode != 200) return Promise.resolve(); 
      return fs.writeFileAsync(filename, body); 
     }) 
     .then(function() { ... }) 

     // ... 
} 

एक वैध इनपुट हो सकता है:

downloadImage('http://goo.gl/5FiLfb', 'c:\\thanks.jpg'); 

मेरा मानना ​​है कि समस्या body की हैंडलिंग के साथ है। मैंने कई एन्कोडिंग में इसे Buffer (new Buffer(body, 'binary') इत्यादि) में कास्ट करने का प्रयास किया है, लेकिन सभी असफल हो गए।

किसी भी मदद के लिए आगे से धन्यवाद!

+0

कोई विचार धाराओं के साथ ऐसा कैसे करेगा? – Curtwagner1984

उत्तर

15

आप request बताने के लिए कि डेटा द्विआधारी है:

requestAsync(uri, { encoding : null }) 

प्रलेखित here:

encoding - एन्कोडिंग प्रतिक्रिया डेटा की setEncoding पर इस्तेमाल किया जा करने के लिए। अगर शून्य, शरीर को एक बफर के रूप में वापस कर दिया जाता है। कुछ और (अपरिभाषित के डिफ़ॉल्ट मान सहित) को ToString() में एन्कोडिंग पैरामीटर के रूप में पारित किया जाएगा (जिसका अर्थ है कि यह डिफ़ॉल्ट रूप से प्रभावी रूप से utf8 है)।

तो बिना किसी विकल्प के, शरीर डेटा को यूटीएफ -8 एन्कोडेड के रूप में व्याख्या किया जाता है, जो यह नहीं है (और एक अवैध जेपीईजी फ़ाइल उत्पन्न करता है)।

+0

धन्यवाद! मुझे नहीं पता कि मुझे यह कैसे याद आया। :) – Selfish

+0

इस उत्तर ने मुझे अंततः वैध पीडीएफ को सहेजने में मदद की जो मैं [अनुरोध-वादा] (https://www.npmjs.com/package/request-promise) के साथ ला रहा था। मैंने कोशिश की [Node.js द्वारा समर्थित प्रत्येक एन्कोडिंग] (http://stackoverflow.com/a/14551669/3212415), लेकिन परिणामी फ़ाइल हमेशा भ्रष्ट थी (और इससे बड़ा होना चाहिए था)। समस्या को हल करना यह था कि यह कैसे शुरू हो रहा था। 'एन्कोडिंग: नल' को जोड़कर इसे ठीक किया गया, और फिर यह ठीक से बचाया गया, इससे कोई फर्क नहीं पड़ता कि मैंने 'fs.writeFile() 'के दौरान किस एन्कोडिंग का उपयोग किया था। धन्यवाद! –

संबंधित मुद्दे