2013-07-29 23 views
2

我正在编写上传脚本,它将接收文件,处理它,并将其返回给用户。处理可能需要几分钟时间。我目前正在做的是为用户提供反馈,在实际上传过程中显示上传栏,上传完成后用“处理”消息替换。一旦文件完成处理,消息将被替换为新文件的链接。这在Chrome中运行良好,但在Firefox中,我只能将进度栏调整为99.9%。有没有办法在关闭连接之前检查上传是否完成?使用AJAX的Firefox中的进度事件未达到100%

这是我目前有

outter = $(".item_box")[0];//content wrapper 
    inner = outter.children[0];//content viewer, will be replaced with messages and content 

    var p = document.createElement("progress"); 
    p.className = "uploadprogress"; 
    p.value = "0"; 
    p.max = "100"; 
    inner.textContent = ""; 
    inner.appendChild(p);//replace initial "click here" message with progress bar 

    var formData new FormData(); 
    for (var i = 0; i < files.length; i++)//files is defined elsewhere and contains form data 
    { 
     formData.append('userfile', files[i]); 
    } 

    // now post a new XHR request 
    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', base_url+'upload/upload_media');//url of php script 
    xhr.responseType = "json"; 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == 4)//ajax request complete 
     { 
      p.value = p.innerHTML = 100;//set progress bar to 100% 
      var data = JSON.parse(xhr.responseText);//my returned json object 
      outter.removeChild(inner); 
      var v = document.createElement("video"); 
      v.controls = "controls"; 
      v.innerHtml = data.msg; 
      outter.appendChild(v); 
     } 
    } 
    xhr.upload.onprogress = function (e)//handles progress bar value 
    { 
     if (e.lengthComputable) 
     { 
      var done = e.position || e.loaded, total = e.totalSize || e.total; 
      p.value = p.innerHTML = (Math.floor(done/total*1000)/10); 
      if (done == 100)//this never happens in firefox 
      { 
       inner.removeChild(p); 
       inner.textContent = "processing... please wait"; 
      } 
     } 
    } 
    xhr.send(formData); 

回答

0

这是在Firefox奇怪的问题,我也穿过来了。我通过将代码从onprogress事件移动到xhr.readyState来解决这个问题。我从onprogress事件中删除它,因为如果我把它放在两个地方,我的代码就会产生问题。

0

呃...... Firefox还没有修复这个bug。我正在努力解决FF版本28中的相同问题。与OP一样,I 不能将的代码从“onprogress”处理程序移动到“onload”处理程序,因为“onload”直到脚本具有已完成处理上传的文件 - 这可能比文件上传完成后要晚得多。上传的文件越小,FF越早停止报告进度(例如,280K文件可能会停止报告84%,而5 MB文件可能会一直达到99% - 但从未100%)。由于OP处理的是一致的大文件,因此他可以将其条件设置为“(完成== 99)”或类似的阈值。不幸的是,这对我或其他人处理各种文件大小不起作用。来吧,Firefox!