繁体   English   中英

Cordova将文件从App下载到设备

[英]Cordova Download File From App to Device

我正在使用Cordova开发移动应用程序。 在应用程序中有.docx格式的教程,我需要将其从应用程序传递到设备,以便可以将其打开。 有没有更好的方法可以做到这一点,请告诉我,但这就是我所拥有的。 用户单击一个按钮以查看教程文档,然后在用户可以查看.docx文件的任何应用程序中打开该文档。 它只能在Android上正常运行,而不能在iOS上运行,我不知道为什么。 在iOS上但不是Android上,下载功能中抛出FileTransferError,错误代码为3。 我已经搜索过了,但是我能找到的所有东西都是从Web服务器下载的。 谁能告诉我为什么我在iOS上却收到错误代码3,但在Android上却没有?

这是单击查看教程的按钮时调用的代码:

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

这是下载功能:

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>

我能够使用cordova-plugin-inappbrowser在iOS上找到解决方法。 使用cordova.InAppBrowser.open("docs/app-tutorial-en.docx", "_blank", { location: "no", closebuttoncaption: "Done" }); 在iOS上可以使用,但在Android上却无法使用。 因此,我在问题中使用代码,因为它适用于Android,而此答案中的代码适用于iOS。 如果有人可以提供更好的解决方案,我欢迎其他建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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