2

我正在使用 Phonegap 下载档案,解压缩,然后阅读文件。在我尝试将文件作为文本读取之前,一切正常。如果我使用readAsDataURL(),那么我会在控制台中记录一大堆东西。

function( file ) {
    console.log(file);
    var reader = new FileReader();
    reader.onloadend = function( evt ) {
        console.log( evt.target.result );
    };                      
    reader.readAsDataURL( file );
}

如果我使用readAsText()我得到null. 文件范围从 300KB 到 1.4MB,但所有文件都null在控制台中返回。

reader.readAsText( file );          

为什么一个函数会返回一些东西而另一个是空的?它可以阅读的文本大小有限制吗?

这是file我在创建之前记录的对象,我reader将函数应用于(我缩短了文件名):

{
    "name":"categories.json",
    "fullPath":"/var/mobile/.../Documents/data/file.json",
    "type":null,
    "lastModifiedDate":1380535318000,
    "size":382456
}

这是 evt 对象readAsText()

{
    "type":"loadend",
    "bubbles":false,
    "cancelBubble":false,
    "cancelable":false,
    "lengthComputable":false,
    "loaded":0,
    "total":0,
    "target":{
        "fileName":"/var/mobile/.../Documents/data/file.json",
        "readyState":2,
        "result":"null",
        "error":null,
        "onloadstart":null,
        "onprogress":null,
        "onload":null,
        "onerror":null,
        "onabort":null
    }
}

更新:我在文件 API 的 W3C 规范中看到,如果发生错误,结果只会设置为 null。但我尝试添加一个reader.onerror()函数,但没有被调用。

如果在读取 blob 参数时发生错误,请将 readyState 设置为 DONE,并将 result 设置为 null。继续执行错误步骤。

http://www.w3.org/TR/FileAPI/#dfn-readAsText

4

1 回答 1

4

您可能一直在抓取 fileEntry 而不是 fileObject。假设文件实际上是 fileEntry,试试这个:

var
    fileEntry = file, //for example clarity - assumes file from OP's file param
    reader = new FileReader()
;

fileEntry.file( doSomethingWithFileObject );//gets the fileObject passed to it

function doSomethingWithFileObject(fileObject){

    reader.onloadend = function(e){
        doSomething(e.target.result); //assumes doSomething defined elsewhere
    }

    var fileAsText = reader.readAsText(fileObject);
}

绝对是一个要求减少杂乱无章的 API。

于 2013-11-29T22:08:03.317 回答