我正在尝试实现上传文件和文件夹的功能。我将一些文件和文件夹放在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
},
为什么会发生这种情况,在这种情况下我该如何处理所有问题?
感谢帮助。
最佳答案
我对此也很头疼。
我这样解决了
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个小时进行调试!
关于javascript - FileEntry.file方法使dataTransferItemList为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12105900/