我正在尝试实现上传文件和文件夹的功能。我将一些文件和文件夹放在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/

10-10 20:25