2012-05-24 22 views
5

के तहत एकाधिक फ़ाइल अपलोड करने के लिए कैसे करें एचटीएमएल 5 चंकिंग का उपयोग करके, मैं छोटे टुकड़े के साथ फ़ाइल अपलोड कर सकता था। लेकिन समस्या तब शुरू होती है जब उसने एकाधिक http POST अनुरोध का उपयोग शुरू किया जो कंप्यूटर को धीमा कर देगा, या शायद क्रैश हो जाएगा। क्या वैसे भी एक http अनुरोध के तहत विभाजित फ़ाइल है .. इसलिए यदि मेरे पास 5 फाइलें हैं तो यह केवल 5 http अनुरोध होगा, हालांकि मैं html5 स्प्लिट खंड1 http अनुरोध

उदाहरण: यदि मैं 5 फाइल अपलोड करता हूं, तो प्रत्येक फ़ाइल विभाजित होगी 1 एमबी खंड में, इसलिए यदि पहली फ़ाइल 10 एमबी है, तो यह 1 एमबी खंड के 10 टुकड़े बन जाएगी। और समस्या यह है कि, प्रत्येक खंड 1 http अनुरोध के तहत होगा, इसलिए केवल पहली फ़ाइल यह 10 HTTP अनुरोध होगी। कल्पना करें कि मेरे पास 1 जीबी फाइलें हैं, तो यह 1000 HTTP अनुरोध बन जाएगी और कंप्यूटर को धीमा कर देगा।

इस उदाहरण कोड है:

 //Prepare element progress after the page load completely 
     var uploaders = []; 
     var totalChunks = 0; 
     var progress; 
     var bars; 
     $(document).ready(function() { 
      //progress = document.querySelector('progress'); 
      //bars = document.querySelector('#bars'); 
     });   

     //function for after the button is clicked, slice the file 
     //and call upload function 
     function sendRequest() {  
      //clean the screen 
      //bars.innerHTML = ''; 


      var file = document.getElementById('fileToUpload'); 

      for(var i = 0; i < file.files.length; i++) {  
       var blob = file.files[i];   
       var originalFileName = blob.name; 
       var filePart = 0 

       const BYTES_PER_CHUNK = 10 * 1024 * 1024; // 10MB chunk sizes. 
       const SIZE = blob.size; 

       var start = 0; 
       var end = BYTES_PER_CHUNK; 

       totalChunks = Math.ceil(SIZE/BYTES_PER_CHUNK); 

       while(start < SIZE) {      
        if (blob.webkitSlice) { 
         //for Google Chrome 
         var chunk = blob.webkitSlice(start, end); 
        } else if (blob.mozSlice) { 
         //for Mozilla Firefox 
         var chunk = blob.mozSlice(start, end); 
        }  

        uploadFile(chunk, originalFileName, filePart, totalChunks, i); 
        filePart++; 
        start = end; 
        end = start + BYTES_PER_CHUNK; 
       } 
      }     
     } 

     function uploadFile(blobFile, fileName) { 
      var fd = new FormData(); 
      fd.append("fileToUpload", blobFile); 

      var xm = $.ajax({ 
       url: "upload.php"+"?"+"file1="+fileName, 
       type: "POST", 
       data: fd, 
       processData: false, 
       contentType: false, 
      });    
     } 

     function uploadFile(blobFile, fileName, filePart, totalChunks, divBarsSelector) { 
      if(filePart == 0) { 
       bars = document.querySelector('#bars' + divBarsSelector); 
      } 

      var progress = document.createElement('progress'); 
      progress.min = 0; 
      progress.max = 100; 
      progress.value = 0; 
      bars.appendChild(progress); 

      var fd = new FormData(); 
      fd.append("fileToUpload", blobFile); 

      var xhr = new XMLHttpRequest();     
      xhr.open("POST", "upload.php"+"?"+"file="+fileName + filePart, true); 

      xhr.onload = function(e) { 
       //make sure if finish progress bar at 100% 
       progress.value = 100; 

       //counter if everything is done using stack 
       uploaders.pop(); 

       if (!uploaders.length) { 
        bars.appendChild(document.createElement('br')); 
        bars.appendChild(document.createTextNode('DONE :)')); 
        //mergeFile(fileName, totalChunks); 
       }     
      }; 

      // Listen to the upload progress for each upload. 
      xhr.upload.onprogress = function(e) {; 
       if (e.lengthComputable) { 
        progress.value = (e.loaded/e.total) * 100; 
       } 
      };     

      uploaders.push(xhr); 
      xhr.send(fd); 
     } 

और प्राप्त करने के लिए सर्वर हिस्सा हो upload.php

$target_path = "uploads/"; 
$tmp_name = $_FILES['fileToUpload']['tmp_name']; 
$size = $_FILES['fileToUpload']['size']; 
$name = $_FILES['fileToUpload']['name']; 

$originalName = $_GET['file']; 

print_r("*******************************************\n"); 
print_r($originalName); 
print_r("\n"); 
print_r($_FILES); 
print_r("\n"); 
print_r("*******************************************\n"); 
$target_file = $target_path . basename($name); 

//Result File 
$complete = $originalName; 
$com = fopen("uploads/".$complete, "ab"); 
error_log($target_path); 

if ($com) { 
    // Read binary input stream and append it to temp file 
    $in = fopen($tmp_name, "rb"); 
    if ($in) { 
     while ($buff = fread($in, 1048576)) { 
      fwrite($com, $buff); 
     } 
    } 
    fclose($in); 
    fclose($com); 
} 
+0

आप अपनी फ़ाइलों को कई भागों में विभाजित है, तो क्यों आप उन्हें पहली जगह में विभाजित हो जाते हैं नहीं करना चाहते हैं? – Carsten

+0

नहीं, मुझे उन्हें विभाजित करने की आवश्यकता है। क्योंकि 1. PHP में अपलोड सीमा है (मुझे पता है कि मैं उस सीमा को बदल सकता हूं, लेकिन यह वास्तव में एक असली समाधान नहीं है) 2. इस तरह से मैं इसे कई टुकड़ों को एक साथ अपलोड कर सकता हूं जो इसे तेज़ी से बना देगा। – Harts

+0

असल में स्प्लिट फ़ाइल मुझे फिर से शुरू करने वाली फ़ाइल (मामले में अचानक कनेक्शन के मामले में) प्राप्त करने में मदद करेगी, उपयोगकर्ता को शुरुआत से शुरुआत नहीं करना पड़ेगा – Harts

उत्तर

6

अपनी टिप्पणी में आपकी प्रेरणा को पढ़ने के बाद मैं एक का कहना चाहते हैं जाएगा कुछ 'गलतफहमी'। सबसे पहले, यह एक फ़ाइल को विभाजित करने के लिए सलाह दी जाती है और अगली बार सभी विभाजित भागों को अपलोड करने के लिए सलाह दी जाती है। फ़ाइल अपलोड को विभाजित करने का पूरा बिंदु PHP अपलोड सीमा को बाईपास करने के लिए नहीं है (जो, यदि लागू हो, बदलना चाहिए और वास्तविक समाधान हो सकता है *), लेकिन इसके बजाय अलग-अलग भाग को क्रमशः क्लाइंट कंप्यूटर पर लोड को न्यूनतम होने की अनुमति देता है, खासकर यदि आप 1 जीबी सामग्री अपलोड करने पर विचार कर रहे हैं। किसी भी तरह से, फाइल को विभाजित करने के लिए गंभीरता से कोई कारण नहीं है और अगले इसे एक ही अनुरोध में गठबंधन करें (हालांकि यह XMLHttpRequest2 के साथ सैद्धांतिक रूप से संभव होगा, लेकिन यदि आप XMLHttpRequest2 का उपयोग कर सकते हैं तो आपको फ़ाइल को किसी भी तरह से विभाजित करने की चिंता नहीं करनी चाहिए , क्योंकि यह कई फ़ाइलों को स्पष्ट रूप से अपलोड करने के लिए आवश्यक नियंत्रण प्रदान करता है)।

* कृपया ध्यान दें कि यदि आप ऐसा करते हैं तो आपको यह सुनिश्चित करना होगा कि आपकी PHP मेमोरी सेटिंग्स सही तरीके से सेट की गई हैं (php को इसे एक temp फ़ाइल में लिखने से पहले पूरी तरह से स्मृति में लोड करने की कोशिश करने के लिए, लेकिन यह नहीं होना चाहिए ' मैं विश्वास करता हूं कि डिफ़ॉल्ट सेटिंग्स के साथ PHP के हाल के संस्करणों पर नहीं होता)। (मुझे यह जोड़ने में बाध्यता है कि मैंने कुछ वर्षों तक PHP और PHP अपलोड के साथ काम नहीं किया है, इसलिए मुझे इस अंतिम टिप्पणी के साथ बहुत अच्छी तरह से गलती हो सकती है)

किसी भी तरह से, फ़ाइलों को लगभग 5-25MB (इस संबंध के आधार पर कि आप कनेक्शन को कितनी अच्छी उम्मीद करते हैं: पी) + अनुक्रमिक अपलोड (प्लस एक अच्छा प्रगति पट्टी अगर XMLHttpRequest2 उपलब्ध है, अन्यथा प्रति प्रगति एक प्रगति पट्टी) ब्राउज़र को अधिभारित होने से रोकने के लिए एक समझदार तरीका प्रतीत होता है। (ओह और, यदि आपको पुराने ब्राउजर का समर्थन करने की ज़रूरत है तो मैं वास्तव में आपको फ्लैश अपलोडर देखने की सलाह देता हूं, क्योंकि ऐप्पल प्रचार फ्लैश बुरा होने के बावजूद, अधिकांश (पुराने) कंप्यूटरों पर यह अब तक का सबसे अच्छा अनुभव देगा)

+0

असल में स्प्लिट फ़ाइल भी मुझे फिर से शुरू करने वाली फ़ाइल को प्राप्त करने में मदद करेगी (कनेक्शन अचानक नीचे होने पर), उपयोगकर्ता को शुरुआत से फिर से शुरू नहीं करना है। तो, आपके समाधान के आधार पर, एक साथ अपलोड करना अच्छा नहीं है? और मुझे अनुक्रमिक रूप से अपलोड करने के साथ रहना चाहिए? बीटीडब्ल्यू फ्लैश और जावा एक विकल्प नहीं है क्योंकि मैं इससे दूर जाने की कोशिश कर रहा हूं, यही कारण है कि मैं HTML5 का उपयोग कर रहा हूं। धन्यवाद – Harts

+0

यह कोई विकल्प नहीं है "क्योंकि" आप इससे दूर जाने की कोशिश कर रहे हैं? यही कारण है कि मुझे आशा नहीं है, क्योंकि आपको खुद को आगे बढ़ने के लिए एचटीएमएल 5 में नहीं जाना चाहिए (इस समय इसके बारे में कुछ भी बेहतर नहीं है, क्योंकि फ्लैश उपलब्धता से इसका बुरा समर्थन है)। कोई फर्क नहीं पड़ता, फ़ाइल अपलोड को फिर से शुरू करने के लिए, यही कारण है कि मैंने कहा कि फ़ाइलों को विभाजित करना मेरे निष्कर्ष में एक अच्छा विचार होगा और कनेक्शन की गुणवत्ता के आधार पर भाग को जितना संभव हो उतना बड़ा बना देगा, लेकिन यदि आप उन्हें एक साथ अपलोड करते हैं तो आप हार जाएंगे सभी फायदे (अपलोड को फिर से शुरू करने के रूप में अवास्तविक भी होगा) –

+0

नहीं, मेरा मतलब है कि मेरे पास जावा में पहले से ही प्रोजेक्ट लिखा गया है (और काम कर रहा है), और अब मैं इसे भविष्य में HTML5 में फिर से लिखने की कोशिश कर रहा हूं। मुझे इस समय पता है कि एचटीएमएल 5 जावा या फ्लैश – Harts

1

जावा अपलोडर [अर्थात्, जंपलोडर] - मैं नहीं कह रहा हूं "उनका उपयोग करें", लेकिन सीखें कि वे कैसे काम करते हैं। अब तक, मैंने देखा है कि सबसे अच्छा अपलोड अभ्यास है: 1) फ़ाइलों को कुछ आकार के हिस्सों में विभाजित करें, 2) अनुक्रमिक रूप से अपलोड करें (अतिरिक्त रूप से भाग के हैंश प्रदान करके, यदि डेटा संवेदनशील है), 3) सर्वर-साइड पर एकजुट भाग (लेकिन यदि आप उनका उपयोग कर रहे हैं, तो हैश के माध्यम से डेटा-अखंडता को सत्यापित करें)।

इस प्रकार आप PHP के max_upload_size प्रतिबंध को बाईपास करेंगे। अन्यथा, मैं व्यक्तिगत रूप से कोई योग्यता नहीं देखता हूं क्यों किसी को डेटा को पहले स्थान पर विभाजित करना चाहिए।

0

इस प्रयास करें:

<script type="text/javascript"> 
    //Prepare element progress after the page load completely 
    var uploaders = []; 
    var totalChunks = 0; 
    var progress; 
    var bars; 
    $ (document).ready(function() { 
     //progress = document.querySelector('progress'); 
     //bars = document.querySelector('#bars'); 
    });   

    //function for after the button is clicked, slice the file 
    //and call upload function 
    function sendRequest() { 
     //clean the screen 
     //bars.innerHTML = ''; 

     var file = document.getElementById('fileToUpload'); 

     for(var i = 0; i < file.files.length; i++) { 
      var blob = file.files[i]; 
      var originalFileName = blob.name; 
      var filePart = 0 

      const BYTES_PER_CHUNK = 10 * 1024 * 1024; // 10MB chunk sizes. 
      const SIZE = blob.size; 

      var start = 0; 
      var end = BYTES_PER_CHUNK; 

      totalChunks = Math.ceil(SIZE/BYTES_PER_CHUNK); 

      while(start < SIZE) { 
       if (blob.webkitSlice) { 
        //for Google Chrome 
        var chunk = blob.webkitSlice(start, end); 
       } else if (blob.mozSlice) { 
        //for Mozilla Firefox 
        var chunk = blob.mozSlice(start, end); 
       }  

       uploadFile(chunk, originalFileName, filePart, totalChunks, i); 
       filePart++; 
       start = end; 
       end = start + BYTES_PER_CHUNK; 
      } 
     } 
    } 

    function uploadFile(blobFile, fileName) { 
     var fd = new FormData(); 
     fd.append("fileToUpload", blobFile); 

     var xm = $ .ajax({ 
      url: "upload.php"+"?"+"file1="+fileName, 
      type: "POST", 
      data: fd, 
      processData: false, 
      contentType: false, 
     }); 
    } 

    function uploadFile(blobFile, fileName, filePart, totalChunks, divBarsSelector) { 
     if(filePart == 0) { 
      bars = document.querySelector('#bars' + divBarsSelector); 
     } 

     var progress = document.createElement('progress'); 
     progress.min = 0; 
     progress.max = 100; 
     progress.value = 0; 
     bars.appendChild(progress); 

     var fd = new FormData(); 
     fd.append("fileToUpload", blobFile); 

     var xhr = new XMLHttpRequest(); 
     xhr.open("POST", "upload.php"+"?"+"file="+fileName + filePart, true); 

     xhr.onload = function(e) { 
      //make sure if finish progress bar at 100% 
      progress.value = 100; 

      //counter if everything is done using stack 
      uploaders.pop(); 

      if (!uploaders.length) { 
       bars.appendChild(document.createElement('br')); 
       bars.appendChild(document.createTextNode('DONE :) ')); 
       //mergeFile(fileName, totalChunks); 
      } 
     }; 

     // Listen to the upload progress for each upload. 
     xhr.upload.onprogress = function(e) {; 
      if (e.lengthComputable) { 
       progress.value = (e.loaded/e.total) * 100; 
      } 
     };     

     uploaders.push(xhr); 
     xhr.send(fd); 
    } 
</script> 
+0

मेरे कोड के साथ अलग क्या है? मुझे अंतर नहीं मिल रहा है? – Harts

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