如何实现可预览上传图片

185 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前端我们做需求的时候,应该经常遇到要求上传图片的场景。

分析:blob或base64位形式上传

实现:

html代码:

<body>
    <div class="main">
        <ul id="lis" class="lis" style="display:none;margin-bottom:0;overflow:hidden;">
        </ul>
        <span class="addPhotoes" id="addPhotoes">
            <!--添加图片-->
            <input type="file" name="" id="fileIt" multiple="multiple">
        </span>
            <button class="changePhoto" id="sureReplaceAll">确定修改</button>
    </div>
</body>

js代码:

var msg = "您可以上传png, jpg, 或者gif格式的图片";
        //转换成blob
        function getObjectURL(file) {
            var url = null
            if (window.createObjectURL != undefined) { // basic    
                url = window.createObjectURL(file)
            } else if (window.URL != undefined) { // mozilla(firefox)    
                url = window.URL.createObjectURL(file)
            } else if (window.webkitURL != undefined) { // webkit or chrome    
                url = window.webkitURL.createObjectURL(file)
            }
            return url;
        }
        //base64检测上传文件是图片
        function validateImg(data) {
            var pos = data.indexOf(",") + 1;
            for (var e in filter) {
                if (data.indexOf(filter[e]) === pos) {
                    return e;
                }
            }
            return null;
        }
        let flag = $("#lis li").length; 
        //获取图片&展示图片
         if (flag == 0 || flag < 0) {
            $("#lis").hide()
        } else {
            $("#lis").show()
        }
        $("#fileIt").change(function () {
            // var file = this.files[0];
            let fl = this.files.length;
            if (flag + fl > 5) {
                alert("上传图片达到最大限制,最多上传5张");
                return
            }
            for (var i = 0; i < fl; i++) {
                var file = this.files[i];
                if (file != undefined) {
                    var imgBlobSrc = getObjectURL(file);
                    //blob
                    if (imgBlobSrc) {
                        if (!/image\/\w+/.test(file.type)) { alert(msg);}//检测上传文件是图片
                        else {
                            flag++
                            let ss = $("#lis li").length
                            if (flag != 0) {
                                $("#lis").append('<li><input type="file" name="" capture="camera"><img class="ps" src="' + imgBlobSrc + '" alt="" ><span class="deletePhoto">x</span></li>')
                            }
                            $("#lis").show()
                            if (flag == 5 || flag > 5) {
                                $("#addPhotoes").hide()
                            } else {
                                $("#addPhotoes").show()
                            }
                        }
                    }
                    //base64
                    //if (window.FileReader) {
                    //    var reader = new FileReader();
                    //    reader.readAsDataURL(file);
                    //    //监听文件读取结束后事件
                    //    reader.onloadend = function (e) {
                    //        imgsrc = e.target.result.split(",")[1]
                    //        //e.target.result就是最后的路径地址
                    //            flag++
                    //            let ss = $("#lis li").length
                    //            $("#lis").append('<li><input type="file" name="" capture="camera"><img class="ps" src="' + imgBlobSrc + '" alt="" ><span class="deletePhoto">x</span><p style=""></p></li>')
                             
                    //    };
                    //}
                }
            }
        });
        
         //删除图片
        $("#lis").on("click", ".deletePhoto", function () {
            $(this).parent().remove()
            flag--
 
            if (flag == 5 || flag > 5) {
                $("#addPhotoes").hide()
            } else {
                $("#addPhotoes").show()
            }
            if (flag == 0 || flag < 0) {
                $("#lis").hide()
            } else {
                $("#lis").show()
            }
        })
        
                
        //确定修改--图片上传
        $("#sureReplaceAll").on("click", function () {
            var photoArr = []
            for (var i = 0; i < $("#lis li").length; i++) {
                photoArr[i] = $("#lis li").eq(i).children("img")[0].currentSrc
            }
            console.log(photoArr)//blob
            if (photoArr == "") {
                alert("未上传图片")
                return
            }
            //$.ajax({
            //    url: "...",
            //    type: 'post',
            //    data: { photoArr: photoArr },
            //    dataType: 'json',
            //    xhr: xhrOnProgress(function (e) {//上传进度
 
 
            //    }),
            //    success: function (data) {
            //        alert("修改完毕")
            //    }
            //})
            
        })
 
 //修改单张图片
        $("#lis").on('change', "li input", function () {
            let Ind = $(this).parent("li").index()
            let file = this.files[0];
            if (file != undefined) {
                if (window.FileReader) {
                    var reader = new FileReader();
                    reader.readAsDataURL(file);
                    //监听文件读取结束后事件    
                    reader.onloadend = function (e) {
                        var imgBlobSrc = getObjectURL(file)
                        if (!/image\/\w+/.test(file.type)) { alert(msg); }
                        else {
                            $("#lis li").eq(Ind).find("img").attr("src", imgBlobSrc)
                        }
                    };
                }
            }
        })
        
        $("#lis").on("click", ".deletePhoto", function () {   //删除图片
            $(this).parent().remove()
            flag--
            if (flag == 5 || flag > 5) {
                $("#addPhotoes").hide()
            } else {
                $("#addPhotoes").show()
            }
            if (flag == 0 || flag < 0) {
                $("#lis").hide()
            } else {
                $("#lis").show()
            }
        })
        
        //确定修改并上传
        $("#sureReplaceAll").on("click", function () {
            var photoArr = []
            for (var i = 0; i < $("#lis li").length; i++) {
                photoArr[i] = $("#lis li").eq(i).children("img")[0].currentSrc
            }
            console.log(photoArr)//blob
            if (photoArr == "") {
                alert("未上传图片")
                return
            }
            $.ajax({
                url: "...",
                type: 'post',
                data: { photoArr: photoArr },
                dataType: 'json',
                xhr: xhrOnProgress(function (e) {//上传进度
 
                }),
                success: function (data) {
                    alert("修改完毕")
                }
            })
        })

代码中flag的值是最多上传图片数量,这个可以自己根据需求做出限制。