jquery ajax进度自定义计算

时间:2016-07-09 17:40:00

标签: php jquery ajax xmlhttprequest progress

在执行处理图片的长PHP脚本时,我需要在我的ajax进度条上提供建议。 我知道有很多关于stackoverflow的问题,比如

我看到的大多数示例都使用文件大小来计算进度。  但在我的情况下,我想根据images_treated / total_images计算百分比。

所以我仍然无法按照自己的意愿做这项工作。

在JS轰鸣声中,我评论了我从另一个问题和dataType: 'json'进行测试的非工作进度函数,但我更喜欢我仍然可以使用JSON返回。

问题

  1. console.log()只会记录一次 - 完成完整脚本后。我做错了吗?
  2. 我应该写什么来取代评论?
  3. 在某些答案中,PHP标头设置为标头('Content-Type:application / octet-stream');是强制还是更好?
  4. 使用Javascript:

            $.ajax(
            {
                type: 'GET',
                // dataType: 'json',
                url: formAction,
                data: 'addImagesToArticle',
                cache: false,
                xhr: function()
                {
                    var xhr = new window.XMLHttpRequest();
    
                    // Download progress.
                    xhr.addEventListener("progress", function(e)
                    {
                        console.log(e);
                        // I saw this piece of code from another question it is supposed to work... Maybe my PHP?
                        /*var lines = e.currentTarget.response.split("\n");
                        var progress = lines.length ? lines[lines.length-1] : 0;
    
                        $('#progress').text(progress);*/
                    }, false);
                   return xhr;
                }
            });
    

    我的PHP非常大,所以我只是快速解释一下:在pics的循环中我有变量$images_treated$total_images。在循环之后,在{error: bool, message: string, ...}之类的对象中通过JSON将摘要返回给JS,所以如果有一种方法可以使进度工作而不回显但是设置一个完美的JSON变量!

    感谢您的帮助!

    [编辑]添加上下文详细信息。

    我想在管理方面使用它,在带有WYSIWYG的文章版本中,我有dropzone处理我的多个图像上传。

    然后我看到图像的预览,而每个图像都放在服务器上的临时文件夹中。然后我可以根据需要删除一些图像,一旦所有图像都是确定的,我点击一个按钮来处理它们以调整2个尺寸并在文章WYSIWYG编辑器中用img注入图形标记。

1 个答案:

答案 0 :(得分:0)

Waw我找到了解决方案!

我很高兴发现我不了解PHP的新内容,并与那些也不知道的人分享(在下面的步骤3中)!

@riccardo谈论套接字是对的 - 我不太了解 - 但我不需要那么远。

因此,在能够更接近目标之前,我需要解决多项问题。

  1. 不使用xhr.addEventListener("progress"...,而是在计时器中使用第二个ajax:它在资源消耗方面的重量也会更轻。

  2. 而不是使用像setIntervalsetTimeout这样的计时器 - 因为请求是异步的,它可能会以不需要的顺序出现 - 在第一次调用的回调中使用递归调用,如:

    function trackProgress()
    {
        $.getJSON('create-a-new-page.html', 'ajaxTrackProgress=1', function(response)
        {
            var progress = response.progress;
            $('#progress').text(progress);
    
            if (progress < 100) trackProgress();
        });
    }
    
  3. 然后意识到我的第二个脚本调用因第一个脚本仍在运行而延迟了?是。所以这里的关键是session_write_close()! 由于这个好帖子,我可以用这种方式挖掘: https://stackoverflow.com/a/1430921/2012407

  4. 我在这里发布了一个非常简单的例子来回复另一个问题:https://stackoverflow.com/a/38334673/2012407

    感谢您在评论中提供的所有帮助,这让我得到了这个解决方案。 ;)