简体   繁体   中英

Cordova Download File From App to Device

I am working on a mobile app using Cordova. There it a tutorial in .docx format in the app and I need to pass it from the app to the device so it can be opened. Is there is a better way to do this let me know please but here is what I have. The user clicks a button to view the tutorial doc which then opens in whatever app the user has that can view .docx files. It works just fine on Android but not on iOS and I can't figure out why. A FileTransferError is thrown in the download function with error code 3. on iOS but not Android. I have searched around but everything I can find is for downloading from a web server. Can anyone tell me why I get an error code 3 on iOS but not Android?

This is the code that is called when the button to view the tutorial is clicked:

function downloadTutorial() {
    var userAgent = navigator.userAgent || navigator.vendor || window.opera;
    if (userAgent.indexOf("Android") > -1) {
        window.resolveLocalFileSystemURL(cordova.file.externalDataDirectory, function (directoryEntry) {
            directoryEntry.getFile("app-tutorial.docx", { create: true }, function (fileEntry) {

            download(fileEntry, encodeURI(cordova.file.applicationDirectory + "www/docs/app-tutorial-en.docx"));
            }, function(e1){
                console.error(`get file failed`);
                console.log(e1);
            });
        }, function(e) {
            console.error(`write failed`);
            console.log(e);
        });
    }
    else if ((userAgent.indexOf("iPad") > -1 || userAgent.indexOf("iPhone") > -1 || userAgent.indexOf("iPod") > -1) && !window.MSStream) {
        window.resolveLocalFileSystemURL(cordova.file.documentsDirectory, function (directoryEntry) {
            console.log(directoryEntry);
            directoryEntry.getFile("app-tutorial.docx", { create: true }, function (fileEntry) {
                console.log(fileEntry);

                download(fileEntry, encodeURI(cordova.file.applicationDirectory + "www/docs/app-tutorial-en.docx"));
            }, function(e1){
                console.error(`get file failed`);
                console.log(e1);
            });
        }, function(e) {
            console.error(`write failed`);
            console.log(e);
        });
    }
}

And here is the download function:

function download(fileEntry, uri) {
    var fileTransfer = new FileTransfer();
    var fileURL = fileEntry.toURL();
    console.log(fileURL);
    var options = new FileUploadOptions();
    options.headers = { Connection: "close" };

    fileTransfer.download(uri, encodeURI(fileURL), function (entry) {
        console.log("Successful downloaded tutorial file.");

        cordova.plugins.fileOpener2.open(
            fileURL,
            "application/vnd.openxmlformats-officedocument.wordprocessingml.document", {
                error : function(e) {
                    console.error(`Error status: ${e.status} - Error message: ${e.message}`);
                },
                success : function () {
                    console.log('file opened successfully');
                }
            }
        );
    },
    function (error) {
        console.error(`file transfer error ${error}`); // a FileTransferError is logged here with the source, destination and error code 3
    }, false, options);
}

config.xml

<widget id="" version="0.18.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name></name>
<description>

</description>
<author email="" href="">

</author>
<content src="index.html" />
<plugin name="cordova-plugin-whitelist" spec="1" />
<plugin name="cordova-plugin-console" spec="1.0.3" />
<plugin name="cordova-plugin-file" spec="4.2.0"/>
<plugin name="cordova-plugin-email" spec="1.1.1"/>
<plugin name="cordova-sms-plugin"/>
<plugin name="cordova-plugin-vibration"/>
<plugin name="cordova-plugin-market"/>
<plugin name="cordova-plugin-ble-central"/>
<plugin name="cordova-sqlite-storage"/>
<plugin name="cordova-plugin-globalization"/>
<plugin name="cordova-plugin-file-transfer"/>
<plugin name="cordova-plugin-file-opener2"/>
<preference name="AndroidPersistentFileLocation" value="Compatibility"/>
<preference name="AndroidExtraFilesystems" value="sdcard,cache,files-external"/>
<preference name="iosExtraFileSystems" value="bundle,documents"/>
<access origin="*" />
<preference name="Orientation" value="portrait" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
    <allow-intent href="market:*" />
    <preference name="android-minSdkVersion" value="19"/>
    <icon src="www/img/Icon-App.png"/>
</platform>
<platform name="ios">
    <allow-intent href="itms:*" />
    <allow-intent href="itms-apps:*" />
    <preference name="deployment-target" value="8.0"/>
</platform>
<engine name="android" spec="~4.3" />
<engine name="ios" spec="~4.1.1" />
<plugin name="cordova-sqlite-storage" spec="~1.4.8" />
</widget>

I was able to find a workaround on iOS using cordova-plugin-inappbrowser. Using cordova.InAppBrowser.open("docs/app-tutorial-en.docx", "_blank", { location: "no", closebuttoncaption: "Done" }); works on iOS but I couldn't get it to work on Android. So I'm using the code in the question since it works for Android and the code in this answer for iOS. If anyone can provide a better solution I'm open to other suggestions.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM