2011-10-22 13 views
35

मैं एक ऐसा एप्लिकेशन बना रहा हूं जो कुछ फ़ाइल अपलोड करता है और उन्हें सीधे S3 पर भेजता है। मैं अपने सर्वर पर टीएमपी फ़ाइल भी नहीं करना चाहूंगा, इसलिए मैं नॉक्स मॉड्यूल का उपयोग कर रहा हूं और कच्चे स्ट्रीम को फॉर्मिडेबल से लेना चाहता हूं और इसे नॉक्स पर एस 3 पर भेजना चाहता हूं। मैं इस कोड का उपयोग एक फाइल डाउनलोड करने के लिए नॉक्स का उपयोग कर कुछ इसी तरह किया है:एक नोड-फॉर्मिडेबल फ़ाइल से कच्ची फ़ाइल स्ट्रीम तक पहुंच

knox.downloads.get(widget.download).on('response',function(sres){ 
    res.writeHead(200, { 
     'Content-Type':'application/zip', 
     'Content-Length': sres.headers['content-length'], 
     'Content-Disposition':'attachment; filename=' + widget.download 
    }); 
    util.pump(sres, res); 
}).end(); 

अब मैं (एस 3 को ब्राउज़र से फ़ाइल अपलोड) विपरीत दिशा में कुछ इसी तरह करना चाहते हैं।

अब तक मैं एक ईवेंट हैंडलर लिखा है फ़ाइल से डेटा के प्रत्येक टुकड़े पर कब्जा करने के रूप में अपलोड किया जा रहा है:

var form = new formidable.IncomingForm(); 
form.onPart = function(part){ 
    if(!part.filename){ 
     form.handlePart(part); 
    }else{ 
     if(part.name == 'download'){ 
      // Upload to download bucket 
      controller.putDownload(part); 
     }else{ 
      // Upload to the image bucket 
      controller.putImage(part); 
     } 
     //res.send(sys.inspect(part)); 
    } 
} 
form.parse(req, function(err, fields, files){ 
    if(err){ 
     res.json(err); 
    }else{ 
     res.send(sys.inspect({fields:fields, files:files}), {'content-type':'text/plain'}); 
     //controller.createWidget(res,fields,files);    
    } 
}); 


controller.putDownload = function(part){ 
    part.addListener('data', function(buffer){ 
     knox.download.putStream(data,part.filename, function(err,s3res){ 
      if(err)throwError(err); 
      else{ 
       console.log(s3res); 
      } 
     }); 
    }) 
    knox.downloads.putStream(part, part.filename, function(err,s3res){ 

     if(err)throwError(err); 
     else{ 
      console.log(s3res); 
     } 
    }); 
} 

लेकिन डेटा घटना सिर्फ मेरे बफर दे। तो क्या स्ट्रीम को स्वयं कैप्चर करना और इसे एस 3 पर धक्का देना संभव है?

उत्तर

17

क्या आप क्या करना चाहते ओवरराइड Form.onPart तरीका है। आप वह नहीं चाहते हैं। आप knox डाउनलोड को लिखने के लिए 'भाग' घटनाओं को संभालना चाहते हैं। इस से शुरू करें:

form.onPart = function(part) { 
    if (!part.filename) { 
     // let formidable handle all non-file parts 
     form.handlePart(part); 
     return; 
    } 

फिर नॉक्स अनुरोध खोलने के लिए और कच्चे हिस्सा घटनाओं को संभाल:

part.on('data', function(data) { 
    req.write(data); 
}); 
part.on('end', function() { 
    req.end(); 
}); 
part.on('error', function(err) { 
    // handle this too 
}); 

एक बोनस के रूप में, यदि req.write(data) वापसी झूठी भेजने बफर का मतलब है कि भरा हुआ है। आपको फॉर्मिडेबल पार्सर को रोकना चाहिए। जब आपको नॉक्स स्ट्रीम से drain ईवेंट मिलता है तो आपको फॉर्मिडेबल फिर से शुरू करना चाहिए।

-2

स्ट्रीम को कैप्चर करने का कोई तरीका नहीं है, क्योंकि डेटा को फॉर्मिडेबल द्वारा अनुवादित किया जाना है। buffer आपको buffer.length के हिस्सों में फ़ाइल सामग्री दी गई है: यह समस्या हो सकती है क्योंकि फॉर्मिडेबल के दस्तावेज़ों को देखते हुए ऐसा लगता है कि फ़ाइल पूरी तरह से अपलोड होने तक यह विश्वसनीय रूप से फ़ाइल आकार की रिपोर्ट नहीं कर सकती है और नॉक्स की put विधि की आवश्यकता हो सकती है ।

कभी नॉक्स इस तरह से पहले इस्तेमाल किया है, लेकिन आप कुछ इस तरह के साथ कुछ भाग्य हो सकता है: प्रतिक्रिया बिट्स जाँच के बारे में

controller.putDownload = function(part){ 
    var req = knox.download.put(part.filename, { 
     'Content-Type': 'text/plain' 
    }); 
    part.addListener('data', function(buffer){ 
    req.write(buffer); 
    }); 
    req.on('response', function(res){ 
     // error checking 
    }); 
    req.end(); 
} 

एक छोटी सी अनिश्चित है, लेकिन .... अगर आप में है कि कोड़ा कर सकते हैं आकार। इसके अलावा, Streaming an octet stream from request to S3 with knox on node.js में एक लेखन भी है जो आपके लिए उपयोगी हो सकता है।

IncomingForm.prototype.onPart = function(part) { 
    // this method can be overwritten by the user 
    this.handlePart(part); 
}; 

दुर्जेय का डिफ़ॉल्ट व्यवहार किसी फाइल करने के लिए हिस्सा लिखने के लिए:

5

इसके बजाय multiparty का उपयोग करें। यह इस तरह की स्ट्रीमिंग का समर्थन करता है जैसा आप चाहते हैं। इसमें एस 3: https://github.com/superjoe30/node-multiparty/blob/master/examples/s3.js

+0

पर स्ट्रीमिंग का एक उदाहरण भी है, मैं इतनी अटक गया और इसे हल करने के लिए बहुपक्षीय स्विचिंग –

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