2014-09-12 13 views
10

में डेटा के प्रकार का निर्धारण कैसे करें S3 के लिए node.js API getObject के कॉलबैक में लौटाए गए डेटा के लिए निम्न विवरण देता है। http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property से:S3.getObject()

शरीर - (बफर, टाइप किया हुआ ऐरे, ब्लॉब, स्ट्रिंग, रीडेबलस्ट्रीम) ऑब्जेक्ट डेटा।

क्या यह वास्तविक है? क्या इन चीजों में से कौन सा नियंत्रण नियंत्रित करने का कोई तरीका नहीं है?

उत्तर

12

मुझे नहीं पता कि क्या आप पहले से डेटा के प्रकार को नियंत्रित कर सकते हैं। GetObject() कॉलबैक में प्रदान किया गया बॉडी फ़ील्ड। यदि आप बस इतना करना चाहते हैं कि आपको बफर प्राप्त हुआ है, तो आप Node's Buffer.isBuffer (डेटा। बॉडी) क्लास विधि का प्रयास कर सकते हैं।

वैकल्पिक रूप से, आप पूरी तरह से अमेज़न के S3 documentation से इस दृष्टिकोण समस्या से बचने और उपयोग करने के लिए चाहते हो सकता है:

var s3 = new AWS.S3(); 
var params = {Bucket: 'myBucket', Key: 'myImageFile.jpg'}; 
var file = require('fs').createWriteStream('/path/to/file.jpg'); 
s3.getObject(params).createReadStream().pipe(file); 

यह मानकर आप एक विशिष्ट Node.js async कॉलबैक वातावरण में इस कोड का उपयोग करेंगे, यह कर सकता है अधिक भावना कोड इसलिए की तरह देखने के लिए:

var fs = require('fs'); 

function downloadFile(key, localPath, callback) { 
    var s3 = new AWS.S3(); 
    var params = {Bucket: 'myBucket', Key: key}; 
    var file = fs.createWriteStream(localPath); 

    file.on('close') { 
    callback(); 
    } 

    file.on('error', function(err) { 
    callback(err); 
    }); 

    s3.getObject(params).createReadStream().pipe(file); 
} 
+1

यदि उपरोक्त कोड डाउनलोड करने में विफल रहता है, तो आप त्रुटि को कैसे फंसते हैं? – Mike

+1

@ माइक: 'करीबी' हैंडलर से पहले या उसके बाद, कुछ जोड़ें: file.on ('error', function (err) {callback (err);}); – Bruce

+0

धन्यवाद! धन्यवाद! धन्यवाद! – Mike

3

मैं किसी भी तरह शारीरिक प्रकार या तो बदलने के लिए नहीं मिल सकता है, लेकिन देख शरीर एक बफर था के बाद, मैं इस काम & के साथ एक ReadableStream में बफर तब्दील सुंदर सीधा function: AWS.util.buffer.toStream (या शायद आप streamifier जैसे किसी अन्य lib का उपयोग करना चाहेंगे)।

मैं कुछ और ढूंढने से पहले त्रुटियों को मान्य कर सकता था, अमेज़ॅन के उदाहरण में यह अनुवाद करता है कि "कोई त्रुटि नहीं होने पर केवल लिखें स्ट्रीम बनाएं"।

s3.getObject(params, function(err, data) { 
    if (err) { 
     console.log(err); 
     return; 
    } 

    var file = require('fs').createWriteStream(name); 
    var read = AWS.util.buffer.toStream(data.Body); 

    read.pipe(file); 
    read.on('data', function(chunk) { 
     console.log('got %d bytes of data', chunk.length); 
    }); 
});