为了账号安全,请及时绑定邮箱和手机立即绑定

JS多图预览、删除、上传(详细)

标签:
JavaScript

JS多图上传相比大家都会
但是上传到网页预览的时候,可能会进行筛选,删除一部分
操作file文件想必大家很少有试过吧
下面来说一下完整的实现方法

这里使用的是 formdata  的方式 通过ajax来上传图片

首先我们需要两个按钮   选择图片  、 上传

webp

按钮.png

文件上传的 input太丑了   我们把他隐藏起来
当点击 选择图片按钮的时候  我们用

 $("#file").trigger("click");

来触发Input的点击事件

<div>    <form action="" id="formdata">
        <div id="upload" class="btn btn-primary">选择图片</div>
        <div class="btn btn-success" id="uploadImg">上传</div>
        <input id="file" type="file" multiple style="display:none">
        <div class="gallery" id="gallery"></div>
    </form></div>$("#upload").click(function(){
        $("#file").trigger("click");
   })

现在选择图片已经完成了
我们现在通过  URL.createObjectURL(file)  把图片转成 blob
然后append到页面就可以进行预览了

    $("#file").change(function(){      //每次切换前,把之前的预览图片清空
        document.getElementById("gallery").innerHTML="";      //开始遍历图
        var img=document.getElementById("file").files; 
        var div=document.createElement("div");        for(var i=0;i<img.length;i++){            var file=img[i]; var url=URL.createObjectURL(file); 
            var box=document.createElement("img"); 
            box.setAttribute("src",url); 
            box.className='img';          
           //append到页面上
            var body=document.getElementsByClassName("gallery")[0]; 
            body.appendChild(box);
        }
    })

好的,来张GIF


webp

预览.gif

大家看到我这个上面是有  X号的,可以把预览的图片删除掉
这个就是今天的重点了,怎么把Input里面的 单个 file进行移除操作呢?

事实上,我们是不能直接改变 input type='file'里面的值的,由于安全问题
但是我们可以通过别的方法

当用户选择完图片时,我们用一个数组把 files保存到一个变量中

var img=document.getElementById("file").files; 
var fileList = Array.from(img);

我们生成删除按钮的时候把图片的名称绑定 到删除标签data里面   data-filename

var deleteIcon = document.createElement("span");
            deleteIcon.className = 'delete';
            deleteIcon.innerText = 'x';
            deleteIcon.dataset.filename = img[i].name;
            imgBox.appendChild(deleteIcon);

这样用户点删除的 按钮时,我们就能知道他删除的哪一个了

当用户点击之后拿到 filename
在之前保存的fileList中进行遍历,找到那一个文件,移除

$(deleteIcon).click(function () {               var filename = $(this).data("filename");
                $(this).parent().remove();//页面中移除

                var fileList = Array.from(that.files);                for(var j=0;j<fileList.length;j++){                    if(fileList[j].name = filename){
                        fileList.splice(j,1);//从数组中移除
                        break;
                    }
                }
                that.files = fileList
            })

到了最后的上传了
创建一个formdata对象,把表单的内容放进去
注意:我的file的按钮是没有给 name的  所以,不会传到后台。
因为里面的文件我们也不能控制,所以就用刚刚保存的fileList 添加到 fromdata中

var files = that.files;var uploadFile = new FormData($("#formdata")[0]);for(var i=0;i<files.length;i++){
         uploadFile.append('imgs[]',files[i]);
}

这里的文件必须遍历放进去,不能直接把files丢进去
然后通过ajax发送就好了

$.ajax({                        url:'index.php',                        type:'POST',                        data:uploadFile,                        async: false,                        cache: false,                        contentType: false, //不设置内容类型
                        processData: false, //不处理数据
                        success:function(data){

                        },                        error:function(){
                            alert("上传失败!");
                        }
                    })

再来上个图
虽然这个截图软件大家看不到我的图标,但是结果也能看见了
我上传了3张图,X掉了一张,上传,目录下面出现了两张


webp

GIF.gif

下面给一下完整的 html代码和php代码

<!doctype html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="js/jquery-1.11.3.min.js"></script>
    <style>
        .btn {            border-radius: 0px;            font-weight: 100;            cursor: pointer;            display: inline-block;            padding: 5px;            font-size: 14px;            font-family: '微软雅黑'
        }        .btn-primary {            color: #fff;            text-shadow: 0 1px rgba(0,0,0,.1);            background-image: -webkit-linear-gradient(top,#4d90fe 0,#4787ed 100%);            background-image: -o-linear-gradient(top,#4d90fe 0,#4787ed 100%);            background-image: -webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#4787ed));            background-image: linear-gradient(to bottom,#4d90fe 0,#4787ed 100%);            filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d90fe', endColorstr='#ff4787ed', GradientType=0);            filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);            background-repeat: repeat-x;            border: 1px solid #3079ed;
        }        .btn-success {            color: #fff;            text-shadow: 0 1px rgba(0,0,0,.1);            background-image: -webkit-linear-gradient(top,#35aa47 0,#35aa47 100%);            background-image: -o-linear-gradient(top,#35aa47 0,#35aa47 100%);            background-image: -webkit-gradient(linear,left top,left bottom,from(#35aa47),to(#35aa47));            background-image: linear-gradient(to bottom,#35aa47 0,#35aa47 100%);            filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35aa47', endColorstr='#ff35aa47', GradientType=0);            filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);            background-repeat: repeat-x;            border: 1px solid #359947;
        }         .gallery .img-item{              position: relative;
          }          .gallery .img-item .delete{              position: absolute;              display: block;              width: 20px;              height:20px;              color: #fff;              background: rgba(0,0,0,0.7);              line-height: 20px;              text-align: center;              border-radius: 50%;              top: 25px;              right: 25px;              cursor: pointer;
          }          .img{            width: 300px;            margin: 20px;
          }    </style></head><body><div>
    <form action="" id="formdata">
        <div id="upload" class="btn btn-primary">选择图片</div>
        <div class="btn btn-success" id="uploadImg">上传</div>
        <input id="file" type="file" multiple style="display:none">
        <div class="gallery" id="gallery"></div>
    </form></div><script>
    var files=[];    var that = this;
    $("#upload").click(function(){
        $("#file").trigger("click");
    })

    $("#file").change(function(){        document.getElementById("gallery").innerHTML="";        var img=document.getElementById("file").files; 
        var div=document.createElement("div");        for(var i=0;i<img.length;i++){            var file=img[i]; var url=URL.createObjectURL(file); 
            var box=document.createElement("img"); 
            box.setAttribute("src",url); 
            box.className='img';            var imgBox=document.createElement("div");
            imgBox.style.display='inline-block';
            imgBox.className='img-item';            var deleteIcon = document.createElement("span");
            deleteIcon.className = 'delete';
            deleteIcon.innerText = 'x';
            deleteIcon.dataset.filename = img[i].name;
            imgBox.appendChild(deleteIcon);

            imgBox.appendChild(box);            var body=document.getElementsByClassName("gallery")[0]; 
            body.appendChild(imgBox);

            that.files = img;
            $(deleteIcon).click(function () {                var filename = $(this).data("filename");
                $(this).parent().remove();                var fileList = Array.from(that.files);                for(var j=0;j<fileList.length;j++){                    if(fileList[j].name = filename){
                        fileList.splice(j,1);                        break;
                    }
                }
                that.files = fileList
            })
        }
    })
    $("#uploadImg").click(function(){                var files = that.files;                var uploadFile = new FormData($("#formdata")[0]);                for(var i=0;i<files.length;i++){
                    uploadFile.append('imgs[]',files[i]);
                }                if("undefined" != typeof(uploadFile) && uploadFile != null && uploadFile != ""){
                    $.ajax({                        url:'index.php',                        type:'POST',                        data:uploadFile,                        async: false,                        cache: false,                        contentType: false, //不设置内容类型
                        processData: false, //不处理数据
                        success:function(data){

                        },                        error:function(){
                            alert("上传失败!");
                        }
                    })
                }else {

                }
            })    </script></body></html>
<?php        
    $files=$_FILES['imgs'];
    $msg=array();    foreach ($files['tmp_name'] as $index=>$file){
        $type = $files['type'][$index];        if($type="image/jpeg"){
            $type="jpg";
        }else if($type="image/png"){
            $type="png";
        }        if($type == "png" || $type == "jpg"){
            $name = $files['name'][$index];
            $newname = date ( "Ymdhis" ).rand(0,9999);
            $url = $newname.'.'.$type;
            $upload=move_uploaded_file($file,$url);
        }
    }



作者:明月半倚深秋_f45e
链接:https://www.jianshu.com/p/9094bf58a433


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消