2015-11-05 2 views
5

मेरे पास एक उपयोगकर्ता द्वारा अपलोड की गई एक फ़ाइल है, और मैं निम्नलिखित प्राप्त करना चाहता हूं।छोटे हिस्सों में AJAX के साथ फ़ाइल कैसे अपलोड करें और विफल होने की जांच करें, विफल होने वाले हिस्सों को दोबारा अपलोड करें।

  1. फ़ाइल को मेगाबाइट के बारे में छोटे हिस्सों में विभाजित करें।
  2. प्रत्येक खंड को अपलोड करें, और अगले खंड को अपलोड करने से पहले इसे पूरा करने के लिए प्रतीक्षा करें।
  3. प्रत्येक खंड के लिए सफलता या विफलता रिपोर्ट प्राप्त करें।
  4. विफल हिस्सों को दोबारा अपलोड करें।
  5. प्रतिशत में प्रगति पाएं।

यहां कुछ मोटा जावास्क्रिप्ट है। मैं सचमुच खो गया हूँ। कुछ कोड ऑनलाइन मिला और इसे संशोधित करने का प्रयास किया।

$.chunky = function(file, name){   
       var loaded = 0; 
       var step = 1048576//1024*1024; 
       var total = file.size; 
       var start = 0; 
       var reader = new FileReader(); 

       reader.onload = function(e){ 

       var d = {file:reader.result} 
       $.ajax({ 
        url:"../record/c/index.php", 
        type:"POST", 
        data:d}).done(function(r){ 
        $('.record_reply_g').html(r); 

        loaded += step;     
        $('.upload_rpogress').html((loaded/total) * 100); 

         if(loaded <= total){ 
          blob = file.slice(loaded,loaded+step); 
          reader.readAsBinaryString(blob); 
         } else { 
          loaded = total; 
         } 
       })    
       }; 

       var blob = file.slice(start,step); 
       reader.readAsBinaryString(blob); 
      } 

मैं उपर्युक्त कैसे प्राप्त कर सकता हूं। कृपया एक समझदार समाधान होने पर क्या हो रहा है यह समझाएं।

+0

आप की कोशिश की है https://github.com/blueimp/jQuery-File-Upload/wiki/चंक-फ़ाइल-अपलोड – madalinivascu

+0

खराब शुरुआत नहीं है, आपको एक संचित रेंज के साथ टुकड़ा करने की आवश्यकता है, जो टुकड़ा आकार लोड होगा, और चरण स्थिर रहता है ... सामान्य रूप से, छोटी पीसियों में समस्या को तोड़ने का प्रयास करें, जैसे ऐसा कुछ जो फ़ाइल से डेटा की एक श्रृंखला अपलोड कर सकता है, फिर एपी कला जो फ़ाइल के प्रत्येक भाग पर रेंज अपलोडर को कॉल कर सकती है, फिर त्रुटियों को संभालने के लिए एक हिस्सा, फिर "मैं कर चुका हूं" की घोषणा करने के लिए एक हिस्सा, ... संक्षेप में, अधिक छोटे कार्यों में, कम एक बड़ा अधिभार फ़ंक्शन। – dandavis

+0

@ दंडवीस मेरे पास एक और फ़ंक्शन है जो केवल भाग ही कर सकता है, समस्या प्रत्येक खंड को अपलोड करने की प्रतीक्षा कर रही है। इसकी एक सरणी जिसमें लगभग 1 एमबी के भाग होते हैं। – Relm

उत्तर

5

आप किसी भी चंक अपलोड की विफलता के लिए कुछ भी नहीं कर रहे हैं।

$.chunky = function(file, name){   
    var loaded = 0; 
    var step = 1048576//1024*1024; size of one chunk 
    var total = file.size; // total size of file 
    var start = 0;   // starting position 
    var reader = new FileReader(); 
    var blob = file.slice(start,step); //a single chunk in starting of step size 
    reader.readAsBinaryString(blob); // reading that chunk. when it read it, onload will be invoked 

    reader.onload = function(e){    
     var d = {file:reader.result} 
     $.ajax({ 
      url:"../record/c/index.php", 
      type:"POST", 
      data:d      // d is the chunk got by readAsBinaryString(...) 
     }).done(function(r){   // if 'd' is uploaded successfully then -> 
       $('.record_reply_g').html(r); //updating status in html view 

       loaded += step;     //increasing loaded which is being used as start position for next chunk 
       $('.upload_rpogress').html((loaded/total) * 100); 

       if(loaded <= total){   // if file is not completely uploaded 
        blob = file.slice(loaded,loaded+step); // getting next chunk 
        reader.readAsBinaryString(blob);  //reading it through file reader which will call onload again. So it will happen recursively until file is completely uploaded. 
       } else {      // if file is uploaded completely 
        loaded = total;   // just changed loaded which could be used to show status. 
       } 
      })    
     }; 
} 

संपादित

विफल रही हिस्सा अपलोड करने के लिए फिर से आप निम्न कर सकते हैं:

var totalFailures = 0; 
reader.onload = function(e) { 
    .... 
}).done(function(r){ 
    totalFailures = 0; 
    .... 
}).fail(function(r){ // if upload failed 
    if((totalFailure++) < 3) { // atleast try 3 times to upload file even on failure 
    reader.readAsBinaryString(blob); 
    } else {     // if file upload is failed 4th time 
     // show message to user that file uploading process is failed 
    } 
}); 
+0

यदि फ़ाइल पूरी तरह से अपलोड नहीं की गई है, तो लोड की गई <= कुल), शेष फ़ाइल को अपलोड करने वाले AJAX कैसे है, क्या बाकी फ़ाइल को अपलोड करने के लिए अजाक्स को फिर से कॉल नहीं किया जाना चाहिए? और मैं कैसे जांच सकता हूं कि कोई हिस्सा विफल हुआ है या नहीं? – Relm

+0

जब 'reader.readAsBinaryString (blob)' कहा जाता है तो 'reader.onload' फिर से बुलाया जाता है। तो फ़ाइल अपलोडिंग पुनरावर्ती हो रहा है। – afzalex

+0

ओह ठीक है, समझ में आता है, क्या हम प्रत्येक खंड के लिए विफलता की जांच कर सकते हैं? – Relm

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