2013-07-08 29 views
2

我希望用戶將他們的計算機上的文件上載到瀏覽器中,然後將其內容保存爲字符串以便可以通過程序的其餘部分。我正在查看CSV文件,但理論上,我希望這可以適用於任何包含某種文本的文件。這應該是所有客戶端。我不直接從上傳的文件向服務器發送任何內容。HTML 5 File API在瀏覽器中上傳文件並將內容保存爲字符串

<html> 
<body> 
    <input type="file" id="files" /> 
    <br /> 
    <input type="button" onclick="click()"> 

    <script> 
     var file = this.target; 
     var reader = new FileReader(); 
     reader.onload = function(event){ 
     window.text = event.target.result; 
     }; 

     reader.readAsText(file); 
     console.log(window.text); 

     function click(){ 
      alert(window.text); 
     }; 
    </script> 
</body> 
</html> 

但即使在我選擇了一個文件後,控制檯始終記錄未定義。 onclick功能似乎也不工作(可能是因爲內容未定義?)

如何上傳帶文本的文件並將其內容保存爲字符串作爲變量?

編輯1: 有人留下了一個有用的答案,但我想刪除它。我能夠更好地瞭解發佈的一些信息here,這解釋瞭如何獲取文件的內容,但我仍然有一些困難。該鏈接解釋瞭如何上傳文件,然後顯示包含文件信息的警報以及文件內容的子字符串。 但是,我希望能夠在保存在變量中時看到整個文件的內容。我改變了一部分代碼來創建一個包含我認爲是文件內容的全局變量,但是無論何時我將其登錄到控制檯,即使上傳文件後,它仍會記錄undefined。 onclick警報功能也繼續不顯示。

<input type="button" onclick="click()" /> 
<input type="file" id="fileinput" /> 
<script> 
    function readSingleFile(event) { 
    //Retrieve the first (and only!) File from the FileList object 
     var file = event.target.files[0]; 

     if (file){ 
      var reader = new FileReader(); 
      reader.onload = function(e) { 
       window.contents = e.target.result; 
       alert("Got the file.n" 
        +"name: " + file.name + 
        + "starts with: " + window.contents.substr(1, window.contents.indexOf("n")) 
       ); 
      } 
      reader.readAsText(file); 
     } 
     else { 
      alert("Failed to load file"); 
     } 
    }; 

    document.getElementById('fileinput').addEventListener('change', readSingleFile, false); 

    document.write(window.contents); 
    function click(){ 
     alert(window.contents); 
    }; 
</script> 

如何打印/記錄/提醒/等包含文本的變量,所以我可以看到如何訪問它以後?儘管使用全局變量,但當我嘗試在字符串上運行其他函數時,它說它不能這樣做,因爲它是undefined

編輯2: 隨着Ray Nicholus的意見,我決定創建複製從在onload函數的文件內容到一個全局變量,所以它可以在函數外使用的功能。將我的程序代碼的其餘部分添加到onload函數中幾乎是不可能的,並且需要重新格式化。

function makeGlobalText(s){ 
    window.text = s; 
}; 

function readSingleFile(event) { 
     var file = event.target.files[0]; 

     if (file){ 
      var reader = new FileReader(); 
      reader.onload = function(e) { 
       var contents = e.target.result; 
       alert("Got the file.n" 
        +"name: " + file.name + 
        + "starts with: " + contents.substr(1,contents.indexOf("n")) 
       ); 
       makeGlobalText(contents); 
      }; 
      reader.readAsText(file); 
     } 
     else { 
      alert("Failed to load file"); 
     } 
    }; 

    document.getElementById('fileinput').addEventListener('change', readSingleFile, false); 

再次,嘗試登錄控制檯時,打印到屏幕上,或警報,window.text調用makeGlobalText(contents)在onload函數內部之後,一切依舊不確定或不響應。這一次可能有一些我看不到的小問題。

如果我在onload中創建一個函數,並將其複製到一個全局變量中,爲什麼我無法訪問該變量?

+0

您可以在'onload'處理程序中訪問文件的內容。對該函數內的文件內容做任何你想做的事情。此外,請將您的電話移至'document.write'。 'window.contents'將是未定義的或者執行時的前一個文件的內容。 –

+0

我需要解析這些內容,並通過一堆正則表達式來運行它,這些正則表達式將創建不同的數組,這些數組將全部以AngularJS以某種方式顯示。我應該在onload處理程序中完成這些操作?根本沒有辦法把這個字符串拉出來? – user2494584

+0

在'window'對象上存在內容屬性之前,您當然無法解析內容。 'onload'正在更新這個屬性的值。如果你不想要一個大的'onload'函數,創建你在'onload'中調用的其他函數。 –

回答

0

該腳本沒有文件的上下文,您在調用內聯代碼。您應該使用更改事件或表單提交。

var file = this.target; 
console.log(file); //look at what the "target" is 
var reader = new FileReader(); 
0

你的示例記錄非常相似http://www.htmlgoodies.com/beyond/javascript/read-text-files-using-the-javascript-filereader.html

也許你應該看看:

<input type="file" id="fileinput" /> 
<script type="text/javascript"> 
    function readSingleFile(evt) { 
    //Retrieve the first (and only!) File from the FileList object 
    var f = evt.target.files[0]; 

    if (f) { 
    var r = new FileReader(); 
    r.onload = function(e) { 
     var contents = e.target.result; 
     alert("Got the file.n" 
      +"name: " + f.name + "n" 
      +"type: " + f.type + "n" 
      +"size: " + f.size + " bytesn" 
      + "starts with: " + contents 
    ); 
    } 
    r.readAsText(f); 
    } else { 
    alert("Failed to load file"); 
    } 
} 

document.getElementById('fileinput').addEventListener('change', readSingleFile, false); 
</script> 

我刪除了子調用「開頭:」以後這樣你就可以看到整個文件

+0

如何創建一個將該內容變量保存爲全局變量的函數?請參閱我對問題的第二個編輯。 – user2494584

+0

只是在'contents'之前刪除'var'關鍵字,它將是全局的。但是它的未定義,直到你選擇一個文件。 – lrxw

相關問題