Javascript 使用Phonegap下载多个图像-文件传输

Javascript 使用Phonegap下载多个图像-文件传输,javascript,asynchronous,cordova,file-transfer,Javascript,Asynchronous,Cordova,File Transfer,我在Phonegap中构建了一个离线应用程序,JSON数据被推送到需要的地方。但总是有一堆图像需要跟踪,而html5缓存在应用程序关闭时看到它被清除,就不会这样做。我已经在这件事上破釜沉舟好一阵子了 问题是您想检查文件系统上是否存在该映像。我选择使用“async:false”AJAX调用来实现这一点,因此代码可以运行到一定程度。我没有使用phonegap(几乎是hack)的方式,写入并将overwrite设置为false(这会产生错误),因为这是我不想处理的另一个异步函数(问题在于:异步) 另一

我在Phonegap中构建了一个离线应用程序,JSON数据被推送到需要的地方。但总是有一堆图像需要跟踪,而html5缓存在应用程序关闭时看到它被清除,就不会这样做。我已经在这件事上破釜沉舟好一阵子了

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

另一个问题是Phonegap浏览器允许最好的3次下载(查找)。我以前的功能遇到了这个问题,因为如果同时下载的图像数量太高,它会切断图像的下载,当时大约有20到40个(取决于大小)图像(当然,这并不奇怪,当你将其分为多个下载时,下载速度会急剧下降)

所以问题是,如何建立:

  • 循环处理JSON数据(图像变量)的函数
  • 同时下载三个(并设置元数据,因为苹果告诉它必须这样做)
  • 从磁盘上删除那些不再需要的文件(就我所知,最后一个文件是整个inet的问题,所以我们将保留此选项,因为到目前为止,我实际上不再关心空间)
  • 应在下载所有图像时运行函数
  • 我的代码如下:

    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();
            });
        }
    }
    
    var-datadir=”“;
    var pics_在_时间=0;
    变量外部url图片=”http://Folder 在存储图像的服务器上”;
    //new_config.pics保存JSON数据。生成:'[key(与id相同){“id”:1234567890,“tld”:“jpg”}.id+'.+tld=图像名称。
    requestFileSystem(//获取根文件夹路径
    LocalFileSystem.PERSISTENT,
    0,
    功能(文件系统){
    datadir=fileSystem.root.fullPath;
    },
    函数(){
    log(“无法获取根FS”);
    }
    );
    函数fetch_images(){
    var len=new_config.pics.length;//需要在此处显示的图片数量
    var all_in_计数器=0;
    $.each(新的_config.pics,函数(index,val){//在所有pic中循环
    picu存在(val);
    });
    }
    函数pic_存在(val){
    $.ajax({//pic是否在磁盘上
    async:false,
    url:'file://'+datadir+'/'+val.id+'.+val.tld',//或您的url
    成功:函数(){
    var obj=val.id;
    删除新的_config.pics.obj;
    },
    错误:函数(){
    var obj=val.id;
    删除新的_config.pics.obj;
    下载图像(val);
    }
    });
    }
    函数下载图像(val){
    if(pics_at_the_time<3){//一次只能下载3个。否则请等待下载完成
    时间++上的图片;
    var ft=新文件传输();
    下载(
    外部url图片+val.id+'..+val.tld,
    datadir+“/”+val.id+'.+val.tld,
    功能(条目){
    if(debug_console){console.log(“下载完成:+entry.name);}
    entry.setMetadata(函数(元数据){},函数(错误){console.log(“无法设置元数据:+val.id);},{“com.apple.MobileBackup”:1});//这些图片没有apple cloudbackup。我们可以随时重新下载
    当时的照片--;
    获取图像();
    },
    函数(错误){
    if(debug_console){console.log(“下载错误目标”+错误目标);}
    当时的照片--;
    获取图像();
    });
    }
    }
    
    正如你可能知道的,代码不是很复杂,而且它肯定不会检查已经存在的图像。因为尽管这是可行的,但每次看到它都会重新打开一堆图像还远远不够完美,这起初似乎是个好主意。但现在我有了新的想法

    很明显,我们非常感谢您的帮助