【问题标题】:Progress Bar in ajax while uploading 2 files or more上传2个或更多文件时ajax中的进度条
【发布时间】:2017-02-15 20:29:14
【问题描述】:

嗨,我尝试上传 2 个或更多文件,我的问题是我的进度条会显示 100%,因为先上传小文件,然后再回到大文件的百分比。我的问题是如何如果我要上传很多文件,我能有同样的进度吗?

$('body').on('change', 'input:file.gallery_images', function(event)
{
    event.preventDefault();

    var data = new FormData();
    data.append('id', $("#id").val());

    var count = $(this)[0].files.length;

    $.each($(this)[0].files, function(i, file)
    {
        data.append('userfile', file);

        $.ajax(
        {
            type: "POST",
            url: href+path+"/imagens/store",
            data: data,
            mimeType: 'multipart/form-data',
            contentType: false,
            cache: false,
            processData: false,
            dataType: "json",
            xhr: function()
            {
                var _xhr = $.ajaxSettings.xhr();

                _xhr.addEventListener('progress', function (event) { }, false);

                if (_xhr.upload) 
                {
                    _xhr.upload.onprogress = function(event) 
                    {
                        var percent = 0;
                        if (event.lengthComputable) 
                        {
                            var position = event.position || event.loaded;
                            var total = event.totalSize || event.total;
                            percent = Math.ceil(position / total * 100);
                        }
                        $("#progress-bar").width(percent + '%');

                    };
                }
                return _xhr;
            },
            beforeSend: function()
            {
                $("#progress").fadeIn('slow');
                $("#progress-bar").width('0%');
            },
            success: function(data)
            {
                if(data.gallery)
                {
                    if($(".alert").length > 0) 
                    {
                        $(".alert").hide('slow').remove();
                        $("#droppable").show('slow');
                    }
                    $('.gallery').fadeTo('300', '0.5', function () {
                        $(this).html($(this).html() + data.gallery).fadeTo('300', '1');
                    });
                }
                $("#progress").fadeOut('slow');
            }
        }); 

    });
});

【问题讨论】:

    标签: javascript jquery ajax file


    【解决方案1】:

    好的,我注意到的第一件事是您将文件添加到 $.each 内的“数据”变量中...但这意味着第一个 POST 包含第一个图像,第二个 POST 包含第一个和第二,以此类推。我认为你应该把这部分放在你的 $.each 中:

    var data = new FormData();
    data.append('id', $("#id").val());
    

    好的,所以,解决您的问题:在发送任何内容之前,请检查它们并求和它们的大小。您还需要单独存储每个文件的进度,因此从零开始:

    var sumTotal = 0;
    var loaded = [];
    for (var i = 0, list = $(this)[0].files; i < list.length; i++) {
       sumTotal += list[i].size;
       loaded[i] = 0;
    }
    

    在您的 onprogress 中,您无需将 event.position 与 event.totalSize 进行比较,而是将此位置存储在“已加载”数组中,对所有数组求和,然后将其与 sumTotal 进行比较。

    loaded[i] = event.position || event.loaded;
    var sumLoaded = 0;
    for (var j = 0; j < loaded.length; j++) sumLoaded += loaded[j];
    percent = Math.ceil(sumLoaded * 100/sumTotal);
    

    ;)

    【讨论】:

    • 我发送的“id”对所有人都是一样的。这种方法没有奏效。同样的事情也会发生。只出现一次条形图。
    • 我也不知道投反对票的原因,但值得记住的是,不值得询问投票决定 - 选民早就会继续前进。出于这个原因,由于大多数读者没有登录或投票,我们宁愿投票评论不被编辑到这里的帖子中。如果你真的想问这个问题,请把它留给 cmets,尽管你最多只能从没有投票的人那里得到猜测。
    猜你喜欢
    • 2020-09-25
    • 2012-07-17
    • 2015-10-21
    • 2018-06-30
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多