2013-01-04 36 views
7

Czy istnieje sposób na przesłanie przez klienta pliku w formacie HTML (np. .txt lub .csv) do zmiennej JavaScript w postaci ciągu znaków z użyciem tylko JavaScript? Jeśli tak, czy możesz podać prosty przykład? Nie chcę używać żadnego PHP.Prześlij plik jako ciąg do zmiennej JavaScript

Z góry dziękuję!

+2

Zobacz interfejs FileReader API – yent

+0

Czy to jedyny sposób na zrobienie tego? – Wagtail

+0

ahh nie zauważyłem php! cóż, tylko z JS to niemożliwe! ponieważ jest to skrypty po stronie klienta, nie po stronie serwera;) –

Odpowiedz

5

Oto szybki i brudny przykład oparty na formularzu o nazwie „myForm”, który zawiera wejście plik o nazwie „myfile”:

document.forms['myform'].elements['myfile'].onchange = function(evt) { 
    if(!window.FileReader) return; // Browser is not compatible 

    var reader = new FileReader(); 

    reader.onload = function(evt) { 
     if(evt.target.readyState != 2) return; 
     if(evt.target.error) { 
      alert('Error while reading file'); 
      return; 
     } 

     filecontent = evt.target.result; 

     document.forms['myform'].elements['text'].value = evt.target.result; 
    }; 

    reader.readAsText(evt.target.files[0]); 
}; 

tutaj jest związany formularz HTML:

<form id="myform"> 
    <p> 
    <input id="myfile" name="files[]" multiple="" type="file" /> 
    <textarea id="text" rows="20" cols="40">nothing loaded</textarea> 
    </p> 
</form> 

i a jsfiddle, aby go demonstrować.

3

To wariacja na yent's answer zarządza wieloma przesłane i używa jQuery:

HTML:

<form id="myform"> 
    <p> 
    <input id="myfile" name="files[]" multiple="" type="file" /> 
    <textarea id="text" rows="20" cols="40">nothing loaded</textarea> 
    </p> 
</form> 

scenariusz:

$("#myfile").on("change", function (changeEvent) { 
    for (var i = 0; i < changeEvent.target.files.length; ++i) { 
    (function (file) {    // Wrap current file in a closure. 
     var loader = new FileReader(); 
     loader.onload = function (loadEvent) { 
     if (loadEvent.target.readyState != 2) 
      return; 
     if (loadEvent.target.error) { 
      alert("Error while reading file " + file.name + ": " + loadEvent.target.error); 
      return; 
     } 
     console.log(loadEvent.target.result.length); // Your text is in loadEvent.target.result 
     }; 
     loader.readAsText(file); 
    })(changeEvent.target.files[i]); 
    } 
}); 

Warto zauważyć:

  • Musisz użyć jednego FileRead er dla każdego (współbieżnego) odczytu pliku. W przeciwnym razie pojawi się wyjątek, taki jak The object is already busy reading.
  • Połączenia zwrotne loadEvent będą wywoływane w dowolnej kolejności, prawdopodobnie zależnie od wielkości wysyłania.
  • Zamknięcie loadEvent zobaczy wartość i, która zakończyła pętlę.
  • Wyniki FileReader NIE są tablicami; oni nie mają forEach.

Ta wersja demo jsfiddle zachowuje porządek przesyłania, układając divy w procedurze zmiany.

Powiązane problemy