FileEntry.file方法使dataTransferItemList为空

FileEntry.file method makes dataTransferItemList empty

本文关键字:dataTransferItemList 为空 方法 file FileEntry      更新时间:2023-09-26

我正在尝试实现上传文件和文件夹的功能。我在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个小时调试它!

相关文章:
  • 没有找到相关文章