前端小白不迷路 - 今天来讲jQuery上传文件带进度条效果是如何实现的

673 阅读1分钟

这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战

前言:

哈喽,小伙伴们大家好啊,今天来讲jQuery上传文件带进度条效果是如何实现的。

效果需求:

类型为file的input输入框,选择输入文件后,点击下方提交按钮,显示文件上传进度条,图片上传完成后显示这张传入后端的图片。

y9oeo-jghc9.gif

结构搭建:

<form>
        <input type="file" name="avatar"  class="fileIpt">
        <input type="text" placeholder="请选择文件" class="chanceFile">
        <input type="submit" value="提 交">
    </form>
    
    <!-- 进度条 -->
    <progress style="display: none;" max="100" value="5"></progress>
    
    <!-- 展示图片 -->
    <img width="500" id="pic" src="" alt="">

样式部分:

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body {
            width: 100%;
            height: 100%;
            position: fixed;
            background-image: url(./sky.jpg);
        }
        form {
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);

        }
        .fileIpt{
            display: none;
        }
    </style>

技术介绍:

该实现方法使用的是jQuery,以及Ajax,FormData收集数据

引入jQuery

    <script src="jquery-1.12.4.js"></script>

定义jq对象,方便下面使用

var form = $("form");
var progress = $("progress");
var pic = $("#pic");
var chanceFile = $(".chanceFile");
var fileIpt = $(".fileIpt");

文本输入框点击触发文件输入框的点击事件:

chanceFile.on('click',function(){
    fileIpt.click(); 
})

提交 按钮的submit事件,各步骤分解如下:

form.on("submit", function (e) {
 e.preventDefault();
            // FormData收集数据
            var fd = new FormData(this);
            var files=fileIpt[0].files;
            console.log(files);
            chanceFile[0].value=fileIpt.val().split("\\")[2];
            
            // jQ的ajax方法
            $.ajax({
                type: "POST",
                url: "http://xxx/upload/avatar",
                //图片上传的url,大家根据实际来设置哦
                data: fd,
                contentType: false,
                processData: false,
                xhr: function () {
                    // 在xhr函数中对ajax对象进行拓展功能  

                    var xhr = new XMLHttpRequest();
                    
                    // 处理进度条效果
                    // 需要给xhr注册upload.onprogress事件 
                    ==> 上传文件的进度发生改变就会触发
                    // 注意:该事件的注册需要在send之前,否则没有效果
                    xhr.upload.onprogress = function (e) {
                        // 通过事件对象e既可以获取上传文件的总大小以及当前上传的大小
                        // 把e.total(文件的总大小) 取到赋值给 progress进度条的max
                        // 把e.loaded当前上传大小,取到赋值给 progress进度条的value
                        // console.log(e);

                        // 显示进度条
                        progress.show();
                        progress.attr("max", e.total);
                        progress.attr("value", e.loaded);
                    }

                    // 最后需要将增强后xhr返回出去
                    return xhr;
                },
                success: function (info) {
                    // console.log(info);
                    // js对象 ==> 就不需要自己去使用JSON.parse()
                    pic.attr("src", "http://www.xxx" + info.url);
                    //这个是要上传图片至哪个服务器的地址名
                }
            })
        })

后记:

效果就实现了,大家快试试吧~