使用Phonegap下载多个图像 - FileTransfer

时间:2013-09-10 00:31:23

标签: javascript asynchronous cordova file-transfer

我已经在Phonegap中构建了一个离线应用程序,JSON数据被推送到了需要去的地方。但是总会有一堆图像需要遵循,而html5缓存只会在关闭应用程序时看到它清除。我已经在这一段时间内打破了我的麻烦。

问题是您要检查文件系统上是否存在图像。我选择使用“async:false”AJAX调用来执行此操作,因此代码可以运行到某一点。我没有使用phonegap(几乎是hack)方式写入并将overwrite设置为false(产生错误),这是另一个我不想处理的异步函数(其中存在问题:async)。

另一个问题是,Phonegap浏览器最多允许3次下载(查找)。我之前的功能遭遇了这场灾难,因为如果同时下载的数量很高,当时大约20到40(取决于大小)的图像,它会切断下载图像(当然看到下载速度并不奇怪当你把它分成多次下载时,它会直线下降。)

所以问题是,如何构建:

  1. 循环访问JSON数据(图像变量)的函数。
  2. 当时下载三个(并设置元数据,因为Apple告诉它必须)
  3. 从磁盘中删除那些不再需要的东西(据我所知,这最后一个是整个inet的问题,所以我们保持这个可选的,因为到现在为止我真的不关心空间了)。
  4. 下载所有图像时应运行功能。
  5. 我的代码到目前为止:

    var datadir = "";
    var pics_at_the_time = 0;
    var external_url_pics = "http://Folder on server where images are";
    
    // new_config.pics holds the JSON data. Built: '[ key (same as id) { "id": 1234567890, "tld":"jpg" }'. id+'.'+tld = the image name. 
    
    window.requestFileSystem( // get the root folder path
        LocalFileSystem.PERSISTENT,
        0,
        function(fileSystem) {
            datadir = fileSystem.root.fullPath;
        },
        function() {
            console.log("Could not get root FS");
        }
    );
    
    function fetch_images() {
        var len = new_config.pics.length; // amount of pictures that need to be here
        var all_in_counter = 0;
        $.each(new_config.pics,function(index,val){ // loop through all pics
            pic_exists(val);
        });
    }
    
    function pic_exists(val) {
        $.ajax({ // pic on disk or not
            async:false,
          url: 'file://'+datadir+'/'+val.id+'.'+val.tld, //or your url
          success: function(){
            var obj = val.id;
            delete new_config.pics.obj;
          },
          error: function(){
            var obj = val.id;
            delete new_config.pics.obj;
            downloadImage(val);
          }
        });
    }
    
    function downloadImage(val){
        if(pics_at_the_time < 3) { // only 3 at a time. else wait for a download to finish
            pics_at_the_time++;
            var ft = new FileTransfer();
            ft.download(
            external_url_pics+val.id+'.'+val.tld,
            datadir + "/" + val.id+'.'+val.tld,
            function(entry) {
                if(debug_console) { console.log("download complete: " + entry.name); }
                entry.setMetadata(function(metadata) { } , function(error) { console.log("Could not set meta data: "+val.id); }, { "com.apple.MobileBackup": 1}); // no apple cloudbackup for these pics. We can always re-download apparently
                pics_at_the_time--;
                fetch_images();
            },
            function(error) {
            if(debug_console) { console.log("download error target " + error.target); }
            pics_at_the_time--;
            fetch_images();
            });
        }
    }
    

    正如您可能已经知道的那样,代码不是很复杂,并且它绝对不会检查已有的图像。因为虽然这样可行,但是每次看到它重新回到这一点都远非完美,这一开始似乎是一个好主意。但现在我有了第二个想法。

    显然感谢任何帮助

0 个答案:

没有答案