我在我的白衣年底。 我會盡量保持簡短。 使用Cordova/Phonegap 3.0(並在2.8.0上獲得相同的結果)。 Android版本4.0.4。 代碼適用於BlackBerry10(Q10和Z10)。如何在Android上使用phonegap/cordova下載和保存文件
在Android上,它帶有JSON錯誤的錯誤(不,我不解析JSON,這似乎是從科爾多瓦的腸子裏出來)。我將在此結尾粘貼JSON.stringified錯誤對象。
所以,上代碼,然後: 一是文件系統成功函數:
function onFSSuccess(fileSystem) {
if (fileSystem == null) {
window.alert("fileSystem is null");
}
var root = fileSystem.root;
root.getDirectory("com.app.id",{create:true},gotDir,onError);};
然後處理與目錄檢索成功的函數:
function gotDir(d){
DATADIR = d;
doTheDl (d.fullPath + "/update.sql",fileTransfer);
};
然後實際調用來獲取文件系統:
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFSSuccess, null);
然後一個函數來下載文件:
function doTheDl (localPath,fileTransfer) {
try {
window.alert ("Downloading to '" + localPath + "'");
fileTransfer.download (
uri,
localPath,
function (entry) {
try {
$("#dbDownloadProgressContainer").text("File saved to " + entry.name + ". Applying script to database...");
dbInitObj.applyUpdateScript(entry);
}
catch (e) {
window.alert (e);
}
},
function (err) {
window.alert ("ERROROR!!! - " + err);
var errCodeName = err.code;
switch (err.code) {
case FileTransferError.FILE_NOT_FOUND_ERR:
errCodeName ='FILE_NOT_FOUND_ERR';
break;
case FileTransferError.INVALID_URL_ERR:
errCodeName="INVALID_URL_ERR";
break;
case FileTransferError.CONNECTION_ERR:
errCodeName="CONNECTION_ERR";
break;
case FileTransferError.ABORT_ERR:
errCodeName="ABORT_ERR";
break;
default:
errCodeName = "UNKNOWN";
break;
}
window.alert ("Download failed: " + err.source + ", " + err.target + ", " + errCodeName);
},
true
);
}
catch (e) {
window.alert (e);
}
}
人,總得愛所有這些異步回調...... 接下來,我們到了問題的心臟,嘗試讀取下載的文件:
//Bulk of applyUpdateScript script ommited, but eventually it gets here:
function readComplete (evt) {
$("#dbDownloadProgressContainer").text("Parsing script file...");
//Got this gem from here: http://beckism.com/2010/09/splitting-lines-javascript/
var lines = evt.target.result.match(/^.*([\n\r]+|$)/gm);
//var lineIndx = lines.length;
window.setTimeout(function() {
$("#dbDownloadProgressContainer").text("Processing " + lines.length + " statements");
},50);
};
try {
var fileReader = new FileReader();
fileReader.onloadend=readComplete;
fileReader.onerror=function (err) {
//var errStr = translateFileError (err);
window.alert ("FileReader.onerror: " +JSON.stringify (err));
};
fileReader.onloadstart=function (evt) {
window.alert ("FileReader.onloadstart - " + JSON.stringify (evt));
};
fileReader.onload=function (evt)
{
window.alert ("FileReader.onload - Called when the read has successfully completed.- " + JSON.stringify (evt));
};
fileReader.onprogress = function (evt)
{
window.alert ("FileReader.onprogress - " + JSON.stringify (evt));
}
fileReader.onabort = function (evt)
{
window.alert ("FileReader.onabort - " + JSON.stringify (evt));
}
function gotFile (fileEntry) {
window.alert ("Activating reader for file '" + fileEntry.fullPath + "'");
fileReader.readAsText(fileEntry);
};
function noFileFound (fileError) {
alert ("Can not access database update script: code " + translateFileError (fileError));
};
// window.alert ("scriptPath.name = " + scriptPath.name);
DATADIR.getFile (scriptPath.name,null,gotFile,noFileFound);
}
catch (e) {
window.alert (e);
}
現在,當我打的閱讀位,我終於從「的onerror」事件得到這個(的rember這是JSON.stringfied錯誤對象:
{
"type":"error",
"bubbles":false,
"cancelBubble":false,
"cancelable":false,
"lengthComputable":false,
"loaded":0,
"total":0,
"target":{
"_readyState":2,
"_error":{
"code":"JSON error"
},
"_result":null,
"_fileName":"file:///mnt/sdcard/com.app.id/update.sql",
"_realReader":{
"error":null,
"result":"",
"readyState":0
}
}
}
也請注意,「com.app.id」是實際的應用程序ID佔位符 - 不能粘貼那怕敏感的名字。我也嘗試了其他文件夾名稱。 (?) 其他值得注意的項目:
- 下載進度事件似乎表明,我們正在下載精確(WTF?)兩倍的實際文件大小
- 結果是Android設備和仿真器
- 在同一BlackBerry10似乎提前任何聰明的人做工精細
感謝....
巧合的是,我添加的console.log用於捕獲上面的錯誤,正好落在了第666行。所以,也許我應該把它放在「守護進程擁有」並在莫桑比克的海灘上開放吧。 – demaniak
好的,應該早一點檢查過這個waaaaay - 但無論如何,似乎文件已經正確地下載到了SD卡上,這意味着只要閱讀就可以看到梨形。也許尺寸限制?有問題的文件大約是12Mb .... – demaniak
好吧,驗證它不是大小,同樣的事情發生在一個18Kb文件。 – demaniak