【发布时间】:2018-02-21 13:25:38
【问题描述】:
我正在尝试在 JS 中进行多个文件上传。
我在 html 中有这个输入
<input type="file" (change)="fileChange($event,showFileNames)" multiple />
然后对于 onChange 事件执行
this.files = [].slice.call(event.target.files);
input.value = this.files;
This.files 包含要上传的文件数组。
然后在按下 "SUBMIT" 之后,这就是我想要做的。此代码取自先前类似线程的答案,但我仍然没有运气。
upload() {
for (var i = 0; i < this.files.length; i++) { //for multiple files
var that = this;
(function (file) {
var name = file.name;
var reader = new FileReader();
let parts = file.name.split(".");
that.filename = parts[0];
if (typeof (parts[1]) != "undefined")
that.ext = "." + parts[1];
else
that.ext = "";
reader.onload = function (e) {
var x = this.result;
let fileJSON = { "Filename": that.filename, "Extension": that.ext, "DateCreated": new Date(), "Data": btoa(this.result), "Sguid": that.tripsToEditx.sguid };
console.log(fileJSON);
}
reader.readAsArrayBuffer(file);
})(this.files[i]);
}
}
变量名、ext 和 tripsToEditx 是全局变量,我无法通过 .this 访问它们,所以我使用了
var that = this;
无论如何,我仍然要打印 3 次最后选择的文件。
有什么解决办法吗?
【问题讨论】:
-
that.filename = parts[0];如果这是全局的,您将多次打印同一个文件,因为您在这里有异步代码。为什么不直接使用parts[0]作为闭包的一部分。 -
哇,不知道我怎么错过了。现在名称和扩展名有效,但数据对所有人都是一样的。关于如何解决这个问题的任何想法?
-
你不能只在 ArrayBuffer 上做一个
btoa,但你可以在一个视图上做一个。我会发布一个 sn-p 作为例子。
标签: javascript file typescript upload