jQuery ajax xhr文件上传进度条监听不正确

前段时间项目中有个文件上传要监听上传进度的需求,在网上看了检测进度的方法都大同小异,几乎都是一样的方法,但是这种方法上传小文件似乎看不出什么问题,但是上传大文件的时候(例如3G的大文件,进度条到100%之后,点击保存上传文件的大小为0,也就是说文件还没上传成功,进度条就到100%了,这到底是什么原因呢?????搞的我头皮发麻。。。。。最后突然在网上看到了别人提问的评论,一下子就搞定了,内心无比喜悦)!!!

这个是原文章链接:jquery ajax xhr监听上传进度显示不准确,求解_百度知道

文章中提到因为 XMLHttpRequest.onProgress 事件能拿到的是网络传输的字节而已;而“上传进度已完成”,实际是指浏览器已经把文件传输给了服务端;但是服务端还有额外的处理时间,这段时间对浏览器来说是不可感知的,它不知道服务端处理需要多久
一般处理思路有这么几种:
1、上传进度设置一个最大值,比如 99%,只有当服务端真正返回结果时才会变到 100%,这种方法最为简单粗暴;
2、尽量减少服务端处理的时间,例如收到文件后交给异步队列去处理,立刻返回给客户端响应,这种方法需要额外做的事件比较多,开发难度更高一些;
3、客户端分片上传,把大文件变成若干段小“文件”,缺点是浏览器只有支持 HTML5 才支持 FormData 分片。

我是采用的第一种方法,简单粗暴又好用

大概代码:

<%--进度条--%>
<div class="imStrategyUploadBar" style="display:none">
    <%--进度条这边的max也要从100改到99--%>
     <progress class="imStrategyProgressBar" value="0" max="99" style="height: 5px;width:70.5%;margin-left:87.61px;"></progress>
     <span class="imStrategyPercentage"></span>//显示进度条百分比
</div>
var request = $.ajax({
            url: '',
            type: 'POST',
            data: formData,
            processData: false,// 不处理发送的数据
            contentType: false,// 不设置Content-Type请求头
            cache: false,
            xhr: function () {
                var myXhr = $.ajaxSettings.xhr();
                if (myXhr.upload) { //检查upload属性是否存在
                    //绑定progress事件的回调函数
                    myXhr.upload.addEventListener('progress', progressHandlingFunction, false);
                }
                return myXhr; //xhr对象返回给jQuery使用
            },
            beforeSend: function () {
                $(".imStrategyProgressBar").val('');
                $(".imStrategyPercentage").text('');
            },
            success: function (responseStr) {
                if (null != responseStr || responseStr != undefined) {
                    var data = $.parseJSON(responseStr);
                }
            },
        });
        $(".ui-dialog .ui-dialog-buttonpane button:last-child").on('click', function () {
            request.abort();//大文件上传过程中关闭弹框,再次打开弹框,刚刚的文件还没上传成功,就会出现进度条一直闪烁的情况,所以关闭弹框的时候要中断ajax请求
        });
        $(".ui-dialog .ui-dialog-titlebar-close").on('click', function () {
            request.abort();
        });

    }
    /**
     * 进度条
     * @param e
     */
    function progressHandlingFunction(e) {
        var curr = e.loaded;//已经上传文件大小情况
        var total = e.total;//附件总大小
        var process = curr / total * 99;//已上传的百分比-----------以前是total*100,改成99
        $(".imStrategyProgressBar").val(process);
        $(".imStrategyPercentage").text(Math.floor(process) + "%");
    }

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,下面是一个简单的示例代码: HTML 文件: ```html <form id="upload-form" enctype="multipart/form-data"> <input type="file" name="file" id="file-input"> <input type="submit" value="上传" id="submit-btn"> </form> <div id="progress"> <div id="progress-bar"></div> </div> ``` JavaScript 代码: ```javascript $(document).ready(function() { // 当表单提交时 $('#upload-form').submit(function(event) { event.preventDefault(); // 获取要上传的文件 var file_data = $('#file-input').prop('files')[0]; // 创建一个 FormData 对象 var form_data = new FormData(); form_data.append('file', file_data); // 发送 Ajax 请求 $.ajax({ url: '/upload', type: 'POST', data: form_data, dataType: 'json', processData: false, contentType: false, xhr: function() { // 创建一个 XMLHttpRequest 对象 var xhr = new XMLHttpRequest(); // 监听上传进度 xhr.upload.addEventListener('progress', function(event) { if (event.lengthComputable) { // 计算上传进度,更新进度条 var percent = Math.round((event.loaded / event.total) * 100); $('#progress-bar').css('width', percent + '%'); } }, false); return xhr; }, success: function(data) { // 上传成功,处理服务器返回的数据 console.log(data); }, error: function(xhr, status, error) { // 上传失败,处理错误信息 console.log(error); } }); }); }); ``` 上面这段代码使用 jQuery 发送 Ajax 请求,创建了一个 FormData 对象来存储要上传的文件,并且设置了一些参数: - `dataType: 'json'` 表示服务器返回的数据是 JSON 格式,jQuery 会自动解析 JSON 数据; - `processData: false` 表示不要对 FormData 对象进行处理,让浏览器处理文件上传; - `contentType: false` 表示不要设置 Content-Type 请求头,让浏览器自动设置; - `xhr: function() {...}` 表示使用 XMLHttpRequest 对象来发送 Ajax 请求,并且监听上传进度。 在监听上传进度的回调函数中,计算上传进度并更新进度条的宽度。最后处理上传成功上传失败的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值