【问题标题】:How to download and save a file using phonegap/cordova on Android如何在 Android 上使用 phonegap/cordova 下载和保存文件
【发布时间】:2013-08-05 11:57:19
【问题描述】:

我已经走到了尽头。 我会尽量保持简短。 使用 Cordova/Phonegap 3.0(并在 2.8.0 上获得相同的结果)。 安卓版本 4.0.4。 代码适用于 BlackBerry10(Q10 和 Z10)。

在 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”事件中得到了这个(记住这是 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?)
  • 在安卓设备和模拟器上结果是一样的
  • BlackBerry10 似乎工作正常

提前感谢任何聪明的人......

【问题讨论】:

  • 巧合的是,我添加的用于捕获上述错误的 console.log 正好落在第 666 行。所以也许我应该放弃它作为“守护进程”并在海滩上打开酒吧在莫桑比克。
  • 好的,应该早点检查一下这个 waaaaay - 但无论如何,文件似乎已正确下载到 SDCard,所以这意味着某些东西会随着读数而变成梨形。也许是大小限制?有问题的文件大约是 12Mb....
  • 好的,验证它不是大小,同样的事情发生在一个 18Kb 的文件上。

标签: android json cordova download filereader


【解决方案1】:

好的。 这是解决方案:

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

非常感谢这位兄弟的 BAJILLION: http://www.html5rocks.com/en/tutorials/file/filesystem/?ModPagespeed=noscript

万一你错过了,神奇的是对 fileEntry 对象上的“file(...)”函数的调用。 为什么它可以在没有它的情况下在 BB10 上运行....aarrggggghhh

【讨论】:

  • 仅供参考 - 我在读取 24Mb(应该是 12Mb)文件时最终遇到了大小问题。通过转储上述整个解决方案并使用 HTTP Range 标头实现部分下载和处理方法来解决该问题。
猜你喜欢
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多