21

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

4

2 回答 2

18

这是一个基于名为“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来演示它。

于 2013-01-04T10:43:27.190 回答
8

yent 答案的这种变体管理多个上传并使用 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 来保留上传顺序。

于 2016-11-28T13:29:43.900 回答