2012-12-20 24 views
19

मैं कई फ़ाइलों को पढ़ने के लिए फ़ाइल रीडर एपीआई का उपयोग कर रहा हूं।एक समय में जावास्क्रिप्ट फ़ाइल रीडर एपीआई के साथ कई फ़ाइलों को पढ़ना

<html> <body> 
    <input type="file" id="filesx" name="filesx[]" 
     onchange="readmultifiles(this.files)" multiple=""/> 
    <div id="bag"><ul/></div> 
<script> 
window.onload = function() { 
    if (typeof window.FileReader !== 'function') { 
     alert("The file API isn't supported on this browser yet."); 
    } 
} 

function readmultifiles(files) { 
    var ul = document.querySelector("#bag>ul"); 
    while (ul.hasChildNodes()) { 
     ul.removeChild(ul.firstChild); 
    } 

    function setup_reader(file) { 
     var name = file.name; 
     var reader = new FileReader(); 
     reader.onload = function(e) { 
      var bin = e.target.result; //get file content 

      // do sth with text 

      var li = document.createElement("li"); 
      li.innerHTML = name; 
      ul.appendChild(li); 
     } 
     reader.readAsBinaryString(file); 
    } 

    for (var i = 0; i < files.length; i++) { setup_reader(files[i]); } 
} 
</script> </body> </html> 

समस्या यह है कि सभी फाइलों को एक ही समय में पढ़ रहे हैं, और जब फ़ाइलें कुल आकार (योग) कि बहुत बड़ी है, ब्राउज़र क्रैश।

मैं एक फ़ाइल को दूसरे के बाद पढ़ना चाहता हूं, ताकि स्मृति खपत कम हो।

क्या यह संभव है?

उत्तर

14

मैं एक समाधान के साथ आया था अपने आप को जो काम करता है।

function readmultifiles(files) { 
    var reader = new FileReader(); 
    function readFile(index) { 
    if(index >= files.length) return; 
    var file = files[index]; 
    reader.onload = function(e) { 
     // get file content 
     var bin = e.target.result; 
     // do sth with bin 
     readFile(index+1) 
    } 
    reader.readAsBinaryString(file); 
    } 
    readFile(0); 
} 
+9

क्यों आप एक नया [FileReader] (https नहीं::

बजाय मैन्युअल रूप से प्रत्येक फ़ाइल पर पुनरावृत्ति, यह बहुत सरल & क्लीनर Object.keys(files) in ES उपयोग करने के लिए // डेवलपर प्रत्येक पढ़ने के लिए .mozilla.org/en/docs/web/API/fileReader) ऑब्जेक्ट? मेरा मानना ​​है कि फ़ाइल रीडर ऑब्जेक्ट का उपयोग '0' (खाली) से '1' (लोडिंग) से बदलकर, और फिर' 2' (किया गया) के बाद बदला जा सकता है। यह आपको कुछ गंभीर ब्राउज़र कीड़े दे सकता है। – Pacerier

15

यह एक करके फ़ाइलें एक पढ़ना चाहिए:

function readmultifiles(files) { 
    var ul = document.querySelector("#bag>ul"); 
    while (ul.hasChildNodes()) { 
     ul.removeChild(ul.firstChild); 
    } 
    // Read first file 
    setup_reader(files, 0); 
} 

// Don't define functions in functions in functions, when possible. 

function setup_reader(files, i) { 
    var file = files[i]; 
    var name = file.name; 
    var reader = new FileReader(); 
    reader.onload = function(e){ 
         readerLoaded(e, files, i, name); 
        }; 
    reader.readAsBinaryString(file); 
    // After reading, read the next file. 
} 

function readerLoaded(e, files, i, name) { 
    // get file content 
    var bin = e.target.result; 
    // do sth with text 

    var li = document.createElement("li"); 
    li.innerHTML = name; 
    ul.appendChild(li); 

    // If there's a file left to load 
    if (i < files.length - 1) { 
     // Load the next file 
     setup_reader(files, i+1); 
    } 
} 
+0

महान जवाब ... –

3

मैं नए उपयोगकर्ताओं को, जो the FileReader API के माध्यम से एकाधिक फ़ाइलों को अपलोड करने के लिए एक समाधान के लिए देख रहे हैं, विशेष रूप से ES का उपयोग कर के लाभ के लिए इस सवाल का अद्यतन करने कर रहा हूँ।

<input type="file" onChange="readmultifiles" multiple/> 
<script> 
function readmultifiles(e) { 
    const files = e.currentTarget.files; 
    Object.keys(files).forEach(i => { 
    const file = files[i]; 
    const reader = new FileReader(); 
    reader.onload = (e) => { 
     //server call for uploading or reading the files one-by-one 
     //by using 'reader.result' or 'file' 
    } 
    reader.readAsBinaryString(file); 
    }) 
}; 
</script> 

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

  • कोई संबंधित समस्या नहीं^_^