2014-10-05 7 views
7

मैं स्थानीय फ़ोल्डर में एक साथ कई फ़ाइलों को अपलोड करने के लिए कप्तान का उपयोग कर रहा हूं। लेकिन मैं कुछ समस्याओं में भाग गया।sails.js (प्रगति पर) में कप्तान के साथ अपलोड को संभालना

upload: function (req, res) { 
    if (_.isEmpty(req.session.User)){ 
     return res.json({          //---> 1 
        success: 0 
       }); 
    }else{ 
     res.setTimeout(0); 
     var MAXBYTES = 10*1000*1000; 

                   //---> 2 
     if (req._fileparser.form.bytesExpected > MAXBYTES){ 
      return res.json({ 
       success: 0, 
       error: 'File size limit exceeded.' 
      }); 
     }else{ 

      req.file('file[]').on('progress', function(event){ 
       return event;         //---> 3 
      }).upload({ 

       maxBytes: MAXBYTES 

      }, function whenDone(err, uploadedFiles) { 
                   //---> 4 
        return res.json({ 
         success: 1, 
        }); 

      }); 
     } 
    } 
}, 

पहले त्रुटि //---> 1 तो उपयोगकर्ता प्रवेश न होने में मैं इस अपलोड प्रक्रिया समाप्त करने और सफलता लौट = 0. यह काम नहीं कर रहा करना चाहते हैं। ग्राहक पक्ष में अनुरोध बिना किसी प्रतिक्रिया के फांसी रखा जाता है।

दूसरी त्रुटि //---> 2 मैं यहां https://github.com/balderdashy/skipper/issues/36 वर्णित एक त्रुटि में भाग गया और इसलिए एक त्वरित फिक्स के रूप में मैंने जीथूब पर टिप्पणियों में इस्तेमाल किया था। लेकिन फिर से समस्या 1 में, मैं इस मुद्दे में भाग गया। यदि फ़ाइल का आकार MAXBYTES से अधिक है, तो मैं इस अपलोड प्रक्रिया को समाप्त करना चाहता हूं और उपयोगकर्ता को सफलता = 0 वापस कराना चाहता हूं। क्लाइंट पक्ष में वापस नहीं जा रहा है।

तीसरी त्रुटि //---> 3 मैं प्रगति पट्टी बनाने के लिए प्रगति पर उपयोग करना चाहता हूं। लेकिन मैं जल्दी से कुछ मुद्दों में भाग गया। सबसे पहले, प्रगति पर उपयोग प्रणाली को बहुत धीमा कर देता है। इसके अलावा यह चौथे चरण में एक त्रुटि की ओर जाता है।

चौथी त्रुटि //---> 4 यदि हम चरण 3 से ('प्रगति') को हटाते हैं, तो यह अपेक्षा के अनुसार काम करता है। अपलोड को पूरा करने पर, यह ग्राहक को सफलता = 1 देता है। हालांकि, जब (0 प्रगति ') return res... चरण //---> 4 में काम नहीं करता है और एक बार फिर ग्राहक अनुरोध किसी भी प्रतिक्रिया के बिना लटकता रहता है।

कुछ सवाल: क्यों नहीं करता है //---> 1 में निम्नलिखित कोड काम करते हुए इसे //---> 4 में अगर ('प्रगति') पर काम करता है

return res.json({ 
    success: 0 
}); 

क्यों प्रगति पर नीचे अपलोड प्रक्रिया को धीमा करता है मौजूद नहीं है बहुत ज्यादा?

मेरे क्लाइंट पक्ष पर बीटीडब्ल्यू मैं form.js प्लगइन का उपयोग करता हूं। और इसलिए मेरा अनुरोध इस तरह दिखता है:

$('#upload').ajaxForm({ 
    uploadProgress: function(event, position, total, percentComplete){ 
     console.log(percentComplete); 
    }, 
    success: function(data) { 
     console.log(data); 
    } 
}); 

उत्तर

4

यह मुझे इस को हल करने के लिए कुछ समय ले लिया है, और समय मैंने किया था द्वारा, मैं पूरी तरह से मेरे सवाल का यहाँ stackoverflow पर के बारे में भूल गया था। ये काम करने के लिए मैंने उठाए गए कुछ कदम उठाए हैं।

upload: function (req, res) { 
    if (_.isEmpty(req.session.User)){ 
     return res.json({ // or destroy connection as shown below 
      success: 0 
     }); 
    }else{ 
     res.setTimeout(0); 
     var MAXBYTES = 10*1000*1000; 

     if (req._fileparser.form.bytesExpected && req._fileparser.form.bytesExpected > MAXBYTES) { 
      // file size exceeded //-> also check filesize on client-size before uploading because this will not send error report back to the client 
      req.connection.destroy(); 
     } 

     req.file('file[]').on('progress', function(event){ 
      // returning anything here was unnecessary 
      // For example jQuery form plugin's client-side `uploadProgress:` will still catch the progress 
     }).upload({ 
      maxBytes: MAXBYTES 
     }, function whenDone(err, uploadedFiles) { 
      var tempFileNames = _.pluck(uploadedFiles, 'fd'); 
      if (_.isEmpty(tempFileNames)) { 
       return res.json({ 
        success: 0, 
        error: '0 files selected.' 
       }); 
      }else{ 
       // process upload 
       return res.json({ 
        success: 1, 
       }); 
      } 
     }); 
    } 
}, 

यह अभी भी सबसे अच्छा समाधान नहीं है। मुझे वास्तव में कुछ हैकी मिलती है। अगर किसी के पास बेहतर समाधान है, तो कृपया साझा करें।

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