Search code examples
androidcordovaphonegap-buildfile-transfer

Incomplete file download from FileTransfer in Cordova


I am attempting to create an app using Phonegap Build while making use of several plugins in order to download an online file to the device's SD card. Making use of the following links:

i) https://www.tutorialspoint.com/cordova/cordova_file_transfer.htm ii)https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file-transfer/index.html#download

I was able to get get this code to work:

function downloadFile() {


 var fileTransfer = new FileTransfer();
  fileTransfer.download(
"http://developer.android.com/assets/images/home/ics-android.png",
"file:///storage/sdcard0/aw2uin.png",
function(entry) {
    alert("download complete: 1" + entry.toURL);
},
function(error) {
    alert("download error source " + error.source);
    alert("download error target " + error.target);
    alert("upload error code" + error.code);
});

}

HOWEVER the problem is that although getting a successCallBack, the file is only partially downloaded. Eg.ics-android.png : this has a file size of 14.7kB, yet the result has a size of 0B. Another example of a 125kB file results in the download of an 104.55kB. My config.xml has the following permissions:

<plugin name="cordova-plugin-file" spec="~4.3.1" />
<plugin name="cordova-plugin-file-transfer" spec="~1.6.1" />
<plugin name="cordova-plugin-network-information" spec="~1.3.1" />
<plugin name="cordova-plugin-whitelist" version="1.3.1" />
<access origin="*" /><!--subdomains="true" /> -->
<preference name="AndroidExtraFilesystems" value="files,files-external,documents,sdcard,cache,cache-external,assets,root" />
<preference name="android-minSdkVersion" value="7" />
<preference name="android-installLocation" value="preferExternal" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-navigation href="*" />  

I've tried searching for an answer but so far it doesn't seem that much others have encountered this error. Where have I gone wrong?/What have I done incorrectly?


Solution

  • Managed to get this to work for me:

    function downloadFile() {
    
    
     window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) {
    
    alert('file system open: ' + fs.name);
    
    
    var url = 'https://....';
    // Parameters passed to getFile create a new file or return the file if it already exists.
    fs.root.getFile('downloaded-image.png', { create: true, exclusive: false }, function (fileEntry) {
        download(fileEntry, url, true);
    
    }, alert("fail1"));
    }, alert("fail2"));
    
    }
    
    function download(fileEntry, url, readBinaryData) {
    
        var fileTransfer = new FileTransfer();
        var fileURL = cordova.file.externalRootDirectory + "filename.png";  
    
        fileTransfer.download(
            url,
            fileURL,
            function (entry) {
                alert("Successful download...");
                alert("download complete: " + entry.toURL());
    
                if (readBinaryData) {
                  // Read the file...
                  readBinaryFile(entry);
                }
                else {
                  // Or just display it.
                  displayImageByFileURL(entry);
                }
            },
            function (error) {
                alert("download error source " + error.source);
                alert("download error target " + error.target);
                alert("upload error code" + error.code);
            },
            null, // or, pass false
            {
                //headers: {
                //    "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
                //}
            }
        );
    
        };