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