2013-08-05 63 views
3

我在我的白衣年底。 我會盡量保持簡短。 使用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似乎提前任何聰明的人做工精細

感謝....

+0

巧合的是,我添加的console.log用於捕獲上面的錯誤,正好落在了第666行。所以,也許我應該把它放在「守護進程擁有」並在莫桑比克的海灘上開放吧。 – demaniak

+0

好的,應該早一點檢查過這個waaaaay - 但無論如何,似乎文件已經正確地下載到了SD卡上,這意味着只要閱讀就可以看到梨形。也許尺寸限制?有問題的文件大約是12Mb .... – demaniak

+0

好吧,驗證它不是大小,同樣的事情發生在一個18Kb文件。 – demaniak

回答

6

確定。 這是解決方案:

function gotFile (fileEntry) { 
     fileEntry.file (function (file) { 
     fileReader.readAsText(file); 
    }); 
}; 

所以感謝一個BAJILLION這個花花公子: http://www.html5rocks.com/en/tutorials/file/filesystem/?ModPagespeed=noscript

在你錯過了的情況下,神奇的是在調用「文件(...)」函數上fileEntry對象。 爲什麼它在BB10上沒有它... aarrgggghhh

+0

僅供參考 - 我在閱讀24Mb(應該是12Mb)文件時最終遇到了大小問題。通過傾銷整個上述解決方案並通過HTTP Range標頭實施部分下載和處理方法來解決這個問題。 – demaniak

相關問題