jquery 文件下载时在JS中添加暂停

bnlyeluc  于 2023-01-20  发布在  jQuery
关注(0)|答案(2)|浏览(263)

我有一个函数如下:

var audit ={
    init: function(){
      var dte = new Date();
      // hook into the get Accruals Link
      var accruals = $("#accruals");
      for (var i = 0, ii = accruals.length; i < ii; i++){
        $(accruals).bind("click", audit.accrualsClicked);
      }

      // hook into the get closed routes button
      var glbtn = $(".glBtn");
      for (var i = 0, ii = glbtn.length; i < ii; i++){
        $(glbtn).bind("click", audit.clickListener);
      }

      // hook into the GL Date1 element
      var glDate1 = $("#glDate1");
      for(var i = 0, ii = glDate1.length; i < ii; i++){
        var myDate = null;
        if ($("#glDate1").attr('rel') != null) {
          myDate = $.datepicker.parseDate("yy-mm-dd", $("#glDate1").attr('rel'));
        }
        else {
          myDate = dte.getFullYear() + '-' + dte.getMonth()+ '-' + dte.getDate();
        }
        $('#glDate1').datepicker({
          dateFormat: 'yy-mm-dd',
          minDate: -120,
          maxDate: '+1D',//'+1M +10D',
          showAnim: 'fadeIn',
          altField: '#actualDate',
          altFormat: 'yy-mm-dd',
          changeMonth: true,
          numberOfMonths: 2,
          showButtonPanel: true,
          defaultDate: myDate
          //onSelect: audit.doInvDate
        });
        $(glDate1).val(myDate);
      }
      // hook into the GL Date2 element
      var glDate2 = $("#glDate2");
      for(var i = 0, ii = glDate2.length; i < ii; i++){
        var myDate2 = null;
        if ($("#glDate2").attr('rel') != null) {
          myDate2 = $.datepicker.parseDate("yy-mm-dd", $("#glDate2").attr('rel'));
        }
        else {
          myDate2 = dte.getFullYear() + '-' + (dte.getMonth() +1) + '-' + dte.getDate();
        }
        $('#glDate2').datepicker({
          dateFormat: 'yy-mm-dd',
          minDate: -120,
          maxDate: '+1D',//'+1M +10D',
          showAnim: 'fadeIn',
          altField: '#actualDate',
          altFormat: 'yy-mm-dd',
          changeMonth: true,
          numberOfMonths: 2,
          showButtonPanel: true,
          defaultDate: myDate2
        });
        $(glDate2).val(myDate2);
      }
  },
  clickListener: function(event){
    audit.download(7);
  },

  accrualsClicked: function(Event){
    audit.download(6);
  },
  removeFile: function(fileName){
    var url     =  'http://'+window.location.hostname+'/truck/admin/export/service/removeFile.svc.php';
    var args    = "filename="+fileName;
    var res     =  audit.doAjax(url,args);
    //document.getElementById("Msg1").style.display = "none";
    if(res == '0'){
      alert('Failed to purge document: '+ fileName +' from file system')
    }
  },
  download: function(process){
    var gl1 = $('#glDate1').val();
    var gl2 = $('#glDate2').val();
    var url   =  'http://'+window.location.hostname+'/truck/admin/export/service/getFile.svc.php';
    var args  = "process="+process+"&gl1="+gl1+"&gl2="+gl2;
    var fileName =  audit.doAjax(url,args);
    if(fileName.length>3){
      var fileurl = "http://"+window.location.hostname+"/truck/admin/export/service/" + fileName;
      window.location = fileurl;
      audit.removeFile(fileName);
    }
  },
  doAjax: function(url, args){
    var retVal;
    retVal =   $.ajax({  
                    type: "GET",
                    url: url,
                    data: args,
                    async: false
                }).responseText;
    if(retVal==null || retVal=="")retval=99;
    return retVal;
  }
}
audit.init();

这在创建文件和创建下载框时效果很好。我的一个要求是在文件创建和用户下载后删除它。是否有办法放置某种类型的暂停或侦听器,以便audit.removeFile(fileName)在用户下载或取消请求之前不运行(参考下载:功能(过程)子功能)?

csbfibhn

csbfibhn1#

不幸的是,在客户端上(目前)答案是否定的。下载发生在与页面和客户端JavaScript存在的范围不同的范围内。在页面内无法监视任何相关事件。
我想到了几个服务器端选项:

  • 如果你的服务器在下载文件时对文件进行了锁定,很多人(大多数?)都是这样做的,你可以安全地使用一个自动化的过程来定期清除临时目录。只要确保这个过程跳过服务器打开的文件,并且不会挂起它们。
  • 如果您通过自己的代码提供下载服务,而不是将用户指向静态文件(即使您的代码最终只是充当中间人,将静态文件流下来),那么您将知道下载何时完成,并可以在完成后立即删除该文件。
ovfsdjhp

ovfsdjhp2#

正如DaveWard指出的那样,您描述的方法行不通,我只是在服务器上以给定的时间间隔运行一个作业,删除所有超过(比如说)10分钟的文件。
然而,如果你 * 需要 * 找到一个客户端解决方案,你可以尝试使用弹出窗口。
在全局作用域中,您可以添加一个函数:

var popup = window.open(fileUrl);
popup.addEventListener('unload', function(){
  audit.removeFile();
});

请记住,您不应该将卸载事件用于任何重要的事情,因为有许多事情可能会阻止它运行。

相关问题