FileEntry.file方法使dataTransferItemList为空

时间:2012-08-24 08:41:59

标签: javascript html5

我正在尝试实现上传文件和文件夹的功能。我在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
    },

为什么会发生这种情况?如何处理所有这些情况? 谢谢你的帮助。

1 个答案:

答案 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个小时调试这个,然后才找出解决方案!