我正在尝试实现上传文件和文件夹的功能。我在chrome中删除了一些文件和文件夹,然后我得到了dataTransferItemList类型的条目列表,然后我想对列表中的每个条目执行一些操作。我得到一个带有webkitGetAsEntry函数的条目,当我尝试调用FileEntry对象的文件函数时,dataTransferItemList变为空。
_processEntries: function () {
//this._entries list of entries of type dataTransferItemList
var entry = this._getNetxFileEntry(this._entries);
if (!isNullOrUndefined(entry)) {
if (entry.webkitGetAsEntry) {
entry = entry.webkitGetAsEntry();
} else {
//TODO: code for other browsers without getAsEntry implementation
}
if (entry.isFile) {
this._readAsFileEntry(entry);
}
else if (entry.isDirectory) {
this._readAsDirectoryEntry(entry);
}
}
},
_readAsFileEntry: function (fileEntry) {
fileEntry.file($.proxy(this._onFileSuccessfullyRead, this));
},
_onFileSuccessfullyRead: function (file) {
//Here this._entries becomes empty so i can't read next entry
},
为什么会发生这种情况?如何处理所有这些情况? 谢谢你的帮助。
答案 0 :(得分:3)
我也有很多令人头疼的问题。
我这样解决了
afterInit : function() {
this.uploads = [];
this.entries = [];
for ( var i = 0; i < this.options.items.length; i++)
this.entries.push(this.options.items[i].webkitGetAsEntry());
this.scan(0);
},
scan : function(i) {
if (i >= 0 && i < this.entries.length) {
var entry = this.entries[i];
if (entry.isDirectory) {
entry.createReader().readEntries(this.readEntries.bind(this, i + 1));
} else if (entry.isFile) {
this.manageFileEntry(entry);
this.scan(i + 1);
}
} else if (this.uploads.length > 0)
this.doUpload(0);
}
请记住.file()和.readEntries()是异步的。这意味着您的方法将立即返回,并允许JS引擎“释放”资源。作为异步,有一个时刻(即你的方法返回时),其中dataTransferItemList超出范围,因此,释放(设置为null)。
正如您在我的代码中所看到的,由于对.file()或.readEntries()的异步调用,我会在我的项目超出范围之前预防性地保存调用.webkitGetAsEntry()的条目引用。
希望这有帮助,我花了2个小时调试这个,然后才找出解决方案!