将文件作为字符串上载到JavaScript变量

时间:2013-01-04 10:26:28

标签: javascript file-upload javascript-events html-form

客户端是否有任何方法可以使用JavaScript将HTML格式的文件(例如.txt或.csv格式)作为字符串上传到JavaScript变量?如果是这样,你能提供一个简单的例子吗?我不想使用任何PHP。

提前致谢!

2 个答案:

答案 0 :(得分:10)

这是一个基于名为“myform”的表单的快速而脏的示例,其中包含名为“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]);
};

以下是相关的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>

jsfiddle进行演示。

答案 1 :(得分:5)

yent's answer上的此变体管理多个上传并使用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>

脚本:

$("#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]);
  }
});

值得注意的是:

  • 您必须为每个(并发)文件读取使用一个FileReader。否则,您会看到The object is already busy reading
  • 等异常
  • 将以任意顺序调用loadEvent回调,可能取决于上传的大小。
  • loadEvent闭包将看到结束循环的i值。
  • FileReader结果不是数组;他们没有forEach。

jsfiddle演示通过在更改处理程序中布置div来保留上传顺序。