我正在使用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 );
为什么一个函数会返回一些而另一个函数为null?它可以读取的文字大小是否有限制?
这是我在创建file
之前记录的reader
对象,我正在应用这些函数(我缩短了文件名):
{
"name":"categories.json",
"fullPath":"/var/mobile/.../Documents/data/file.json",
"type":null,
"lastModifiedDate":1380535318000,
"size":382456
}
这是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
}
}
UPDATE :我在W3C规范中看到了File API,如果发生错误,结果只会设置为null。但是我尝试添加reader.onerror()
函数,但是没有被调用。
如果在读取blob参数期间发生错误,请设置readyState DONE并将结果设置为null。继续执行错误步骤。
答案 0 :(得分: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。