Pete
Pete

Reputation: 4622

Phonegap FileReader readAsText returns null but readAsDataURL works

I'm using Phonegap to download an archive, unzip it, then read the files. It's all working until I try and read the files as text. If I use readAsDataURL() then I get a whole heap of stuff logged to the console.

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

If I use readAsText() I get null. The files range from 300KB to 1.4MB, but all files return null in the console.

reader.readAsText( file );          

Why would one function return something and the other be null? Is there a limit on the text size it can read?

This is the file object that I'm logging before creating reader, that I'm applying the functions to (I've shortened the file name):

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

And this is the evt object for 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: I've seen in the W3C spec for the File API that result would only be set to null if an error had occured. But I tried adding a reader.onerror() function, but that wasn't getting called.

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

Upvotes: 2

Views: 4890

Answers (1)

Erik  Reppen
Erik Reppen

Reputation: 4635

You may have been grabbing the fileEntry instead of a fileObject. Assuming file was actually fileEntry, try this:

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);
}

Definitely an API that screams for cruft reduction.

Upvotes: 4

Related Questions