关于javascript:Phonegap FileReader readAsText返回null,但readAsDataURL起作用

Phonegap FileReader readAsText returns null but readAsDataURL works

我正在使用Phonegap下载档案,将其解压缩,然后阅读文件。一切正常,直到我尝试以文本形式读取文件。如果使用readAsDataURL(),则将一堆东西记录到控制台。

1
2
3
4
5
6
7
8
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

1
reader.readAsText( file );

为什么一个函数返回某些内容而另一个为null?它可以读取的文字大小有限制吗?

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

1
2
3
4
5
6
7
{
   "name":"categories.json",
   "fullPath":"/var/mobile/.../Documents/data/file.json",
   "type":null,
   "lastModifiedDate":1380535318000,
   "size":382456
}

这是readAsText()的evt对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
   "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
    }
}

更新:我在W3C规范中看到了File API,只有在发生错误时,结果才会设置为null。但是我尝试添加reader.onerror()函数,但是没有得到调用。

If an error occurs during reading the blob parameter, set readyState
to DONE and set result to null. Proceed to the error steps.

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


您可能正在获取fileEntry而不是fileObject。假设文件实际上是fileEntry,请尝试以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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。