0

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

为什么会发生,在这种情况下我如何处理所有实体?感谢帮助。

4

1 回答 1

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 个小时进行调试!

于 2012-11-18T19:29:26.257 回答