为什么使用Phonegap将文件从远程服务器下载到Android应用程序的文件夹中非常困难?
我差不多一周了。我阅读了每一篇文章并尝试了我发现的每个例子。我读到了不同版本的Phonegap之间报告的差异和错误。我阅读并研究了有关cordova-plugin-file-transfer和cordova-plugin-file的官方文档。我阅读了有关在config.xml文件中正确配置权限和白名单的信息。
我还想知道我没有使用手机的文件资源管理器查看下载的文件,因为Android权限将该文件夹设置为私有,因此我根植了我的手机。
但以上都没有奏效。
这是我的代码。请,如果你想提供你的贡献,不要简单地复制/粘贴其他来源的代码 - 正如我经常看到的那样 - 因为我已经自己做了。
CONFIG.XML(我使用的是Phonegap Build)
<?xml version="1.0" encoding="UTF-8" ?>
<widget xmlns = "http://www.w3.org/ns/widgets"
xmlns:gap = "http://phonegap.com/ns/1.0"
id = "com.my_app"
versionCode = "10"
version = "1.0.0" >
<name>MY_APP</name>
<description>
File download test
</description>
<author href="http://enrico.io">
Me
</author>
<preference name="AndroidPersistentFileLocation" value="Internal" />
<preference name="iosPersistentFileLocation" value="Library" />
<preference name="BackupWebStorage" value="none" />
<plugin spec="https://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer.git" />
<plugin spec="https://git-wip-us.apache.org/repos/asf/cordova-plugin-file.git" />
<plugin name="cordova-plugin-whitelist" spec="1.2.2" />
<access origin="*" subdomains="true" />
</widget>
INDEX.HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
<meta name="format-detection" content="telephone=no" />
<meta name="msapplication-tap-highlight" content="no" />
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: ms-appdata: http://www.enrico.io 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
<title>Downloading file</title>
<script src="phonegap.js"></script>
</head>
<body>
MY_APP
<div id="fs"></div>
<div id="app_folder"></div>
<div id="saving"></div>
<div id="error_code"></div>
<div id="error_source"></div>
<div id="error_target"></div>
<script type="text/javascript">
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, fail);
function onFileSystemSuccess(fileSystem) {
//document.getElementById("fs").innerHTML = fileSystem.name;
var fileTransfer = new FileTransfer();
var fileURL = cordova.file.dataDirectory + "test.txt";
var uri = encodeURI("http://www.enrico.io/phonegap/test.txt");
document.getElementById("app_folder").innerHTML = "App folder = " + fileURL;
fileTransfer.download(
uri,
fileURL,
function(entry) {
document.getElementById("saving").innerHTML = "Saving to... " + entry.toURL();
},
function(error) {
document.getElementById("error_code").innerHTML = "Error code = " + error.code;
document.getElementById("error_source").innerHTML = "Error source = " + error.source;
document.getElementById("error_target").innerHTML = "Error target = " + error.target;
},
false,
{
headers: {
"Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
}
}
);
}
function fail(evt) {
document.getElementById("fs").innerHTML = evt.target.error.code;
}
}
</script>
输出是:
MY_APP
App folder = file:///data/data/com.my_app/files/test.txt
Saving... = file:///data/data/com.my_app/files/test.txt
该文件似乎已正确下载但尚未正确下载。如果我从:
中删除文件名(test.txt)var fileURL = cordova.file.dataDirectory + "test.txt";
OUTPUT IS:
MY_APP
App folder = file:///data/data/com.my_app/files/
Error code = 1
Error source = http://www.enrico.io/phonegap/test.txt
Error target = file:///data/data/com.my_app/files/
修改
正如@Gandhi所建议的那样(请参阅下面的评论)将cordova.file.dataDirectory
更改为cordova.file.externalRootDirectory
它可以正常工作,但文件会下载到file:///storage/sdcard0/
而不会下载到应用的数据目录/文件夹。请记住这个缺点:如果卸载了应用程序,则不会删除应用程序的数据。