Добавление паузы в JS при загрузке файлов - PullRequest
0 голосов
/ 26 октября 2011

У меня есть функция следующим образом:

 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();

Это прекрасно работает при создании файла и создании окна загрузки.У меня есть одно требование - удалить файл после его создания и загрузить его пользователем.Есть ли способ поставить некоторый тип паузы или прослушивателя, чтобы aud.removeFile (fileName) не запускался, пока пользователь не загрузит или не отменит запрос (см. Подфункцию download: function (process))?

Ответы [ 2 ]

1 голос
/ 31 октября 2011

К сожалению, ответ (в настоящее время) нет на стороне клиента. Загрузка происходит в другой области, нежели там, где существует ваша страница и клиентский JavaScript. На странице нет связанных событий, которые вы можете отслеживать.

Несколько опций на стороне сервера, которые приходят на ум:

  • Если ваш сервер поддерживает блокировку файла во время его загрузки, что многие (большинство?) Делают, вы можете безопасно использовать автоматизированный процесс для периодической очистки этого временного каталога. Просто убедитесь, что процесс пропускает открытые сервером файлы и не зацикливается на них.

  • Если вы выполняете загрузку через собственный код, вместо того, чтобы указывать пользователям на статический файл (даже если ваш код в конечном итоге просто выступает в качестве посредника для потоковой передачи этого статического файла), тогда вы будете знать, когда будет загружена завершил и может удалить файл сразу после этого.

0 голосов
/ 31 октября 2011

Как указывает Дейв Уорд, описанный вами подход не сработает.Я бы просто запустил задание с заданным интервалом на сервере, удалив все файлы старше, скажем, 10 минут.

Однако, если вам нужно , чтобы найти решение на стороне клиента, вы могли быпопробуйте использовать всплывающее окно.

В глобальной области вы можете добавить функцию:

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

Имейте в виду, что вам никогда не следует использовать событие unload для чего-то важного, например, числовещи могут помешать ему работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...