Cordova 将文件从应用程序下载到设备
Posted
技术标签:
【中文标题】Cordova 将文件从应用程序下载到设备【英文标题】:Cordova Download File From App to Device 【发布时间】:2017-02-14 20:47:11 【问题描述】:我正在使用 Cordova 开发移动应用程序。在应用程序中有一个 .docx 格式的教程,我需要将它从应用程序传递到设备,以便可以打开它。有没有更好的方法可以让我知道,但这就是我所拥有的。用户单击一个按钮来查看教程文档,然后在用户拥有的可以查看 .docx 文件的任何应用程序中打开该教程文档。它在 android 上运行得很好,但在 ios 上却不行,我不知道为什么。 FileTransferError 在下载函数中抛出,错误代码为 3. 在 iOS 上而不是 Android。我已经四处搜索,但我能找到的一切都是从网络服务器下载的。谁能告诉我为什么我在 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>
【问题讨论】:
【参考方案1】:我能够使用 cordova-plugin-inappbrowser 在 iOS 上找到解决方法。使用 cordova.InAppBrowser.open("docs/app-tutorial-en.docx", "_blank", location: "no", closebuttoncaption: "Done" );
在 iOS 上工作,但我无法让它在 Android 上工作。因此,我使用问题中的代码,因为它适用于 Android,而此答案中的代码适用于 iOS。如果有人可以提供更好的解决方案,我愿意接受其他建议。
【讨论】:
closebuttoncaption 仅适用于 iOS。见这里***.com/questions/42235892/… 是的,这是真的。我只在 iOS 设备上使用它。以上是关于Cordova 将文件从应用程序下载到设备的主要内容,如果未能解决你的问题,请参考以下文章
使用 cordova-plugin-file-transfer 从 URL 下载带有参数的图像到设备
使用 cordova 文件传输将图像/视频保存到 IOS 中的画廊
Cordova 3.4 FileReader 不工作(没有 onloadend)
使用cordova将图片从android画廊分享到cordova应用程序