文件上传,单文件/多文件 一次性上传, 超帅

功能介绍:

文件上传. 可 一次选择单文件, 多文件, 支持预览,  编辑好后, 一次性上传到服务器, 可追加操作,  已经上传到服务的也可以展示和操作
屏幕截图 2022-09-23 102711.jpg

删除文件

已上传到服务器(注:保存提交后才上传)的, 请求远程删除文件, 删除页面内容,  
选择文件,但未上传保存的,  直接删除   
image.png

话不多说, 直接上代码

前端代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>showImages</title>

<style type="text/css">
    .float{
        float: left;
        width : 200px;
        height: 200px;
        overflow: hidden;
        border: 1px solid #CCCCCC;
        border-radius: 10px;
        padding: 5px;
        margin: 5px;
    }
    .float2{
        float: left;
        width : 200px;
        height: 200px;
        overflow: hidden;
        border: 1px solid #CCCCCC;
        border-radius: 10px;
        padding: 5px;
        margin: 5px;
    }
    .fater{
        padding: 2px;
    }
    img{
        position: relative;
    }
    #file_input{
        display: none;
    }
    .delete{
        width: 200px;
        height:200px;
        position: absolute;
        text-align: center;
        line-height: 200px;
        z-index: 10;
        font-size: 30px;
        background-color: rgba(255,255,255,0.8);
        color: #777;
        opacity: 0;
        transition-duration: 0.7s;
        -webkit-transition-duration: 0.7s;
        padding: 20px;
    }
    .delete:hover{
        cursor: pointer;
        opacity: 1;
    }
    button{
        cursor: pointer;
        line-height: 34px;
        padding: 0 20px;
        color: #fff;
        background: #0095DD;
        border-radius: 5px;
        margin:0 9px ;
    }
    #images{
        border: 1px solid #ddd;
        margin-top: 10px;
        min-height: 200px;
    }
    .float2 img{
        width: 200px;
        height: 200px;
    }
    #images2{
        margin-top: 10px;
        /* margin-left: 100px; */
        min-height: 200px;
    }
    .container{
        width: 100%;
        display: flex;
        align-items: center;
        flex-wrap: wrap;
        /* justify-content: space-evenly; */
    }
</style>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
window.onload = function(){
    var input = document.getElementById("file_input");
    var result;
    var dataArr = []; // 储存所选图片的结果(文件名和base64数据)
    var oSelect = document.getElementById("select");
    var oAdd = document.getElementById("add");
    var oSubmit = document.getElementById("submit");
    var oInput = document.getElementById("file_input");
 
    if(typeof FileReader==='undefined'){
        alert("抱歉,你的浏览器不支持 FileReader");
        input.setAttribute('disabled','disabled');
    }else{
        input.addEventListener('change',readFile,false);
    }//handler
    function readFile(){
        var iLen = this.files.length;
        for(var i=0;i<iLen;i++){
            if (!input['value'].match(/.jpg|.gif|.png|.jpeg|.bmp/i)){//判断上传文件格式
                return alert("上传的图片格式不正确,请重新选择");
            };
            var reader = new FileReader();
            reader.readAsDataURL(this.files[i]);  //转成base64
            reader.fileName = this.files[i].name;
            dataArr.push({i})
            reader.onload = function(e){
                result = '<div class="delete">delete</div><div ><img class="float2" src="'+this.result+'" alt="'+this.fileName+'"/></div>';
                var div = document.createElement('div');
                div.innerHTML = result;
                div['className'] = 'fater';
                // document.getElementsByTagName('body')[0].appendChild(div);  //插入dom树
                document.getElementById("images").appendChild(div);  //插入dom树
                var img = div.getElementsByTagName('img')[0];
                img.onload = function(){
                    var nowHeight = ReSizePic(this); //设置图片大小
                    this.parentNode.style.display = 'block';
                    var oParent = this.parentNode;
                    if(nowHeight){
                        oParent.style.paddingTop = (oParent.offsetHeight - nowHeight)/2 + 'px';
                    }
                }
                div.onclick = function(){
                    $(this).remove();                  // 在页面中删除该图片元素
                }
            }
        }
    }
 
    oSelect.onclick=function(){
        oInput.value = "";   // 先将oInput值清空,否则选择图片与上次相同时change事件不会触发
        //清空已选图片
        $('.float').remove();
        oInput.click();
    }
    oAdd.onclick=function(){
        oInput.value = "";   // 先将oInput值清空,否则选择图片与上次相同时change事件不会触发
        oInput.click();
    }
    oSubmit.onclick=function(){
        if(!dataArr.length){
            return alert('请先选择文件');
        }
        $('#form2').ajaxSubmit(function(data){
            layer.closeAll();
            console.log(data);
            if(data.code){
                layer.msg(data.msg,{},function(){
                    location.href="{:url('index',['auth_id'=>input('auth_id')])}"
                })
            }else{
                layer.msg(data.msg);
            }
        })
    }
}
function ReSizePic(ThisPic) {
    var RePicWidth = 200; //这里修改为您想显示的宽度值
 
    var TrueWidth = ThisPic.width; //图片实际宽度
    var TrueHeight = ThisPic.height; //图片实际高度
 
    if(TrueWidth>TrueHeight){
        //宽大于高
        var reWidth = RePicWidth;
        ThisPic.width = reWidth;
        //垂直居中
        var nowHeight = TrueHeight * (reWidth/TrueWidth);
        return nowHeight;  //将图片修改后的高度返回,供垂直居中用
    }else{
        //宽小于高
        var reHeight = RePicWidth;
        ThisPic.height = reHeight;
    }
}
    function del_data(id,_this)
    {
      // 删除远端文件, 这里使用了layer.js 控件, 不喜欢的可以去掉 
      // 附远端地址 https://gitee.com/layui/layer/blob/master/dist/layer.js  
        layer.confirm('该图片已上传,确定要删除吗?',function(index){
            $.post("{:url('photo/img_del')}",{id:id},function(data){
                if(data.code)
                {
                    layer.msg(data.msg,{},function(){
                        _this.remove(); 
                        // location.reload();
                    });
                }else{
                    layer.msg(data.msg);
                }
            })
        })
    }
</script>
</head>
    <body>
        <div class="topSidebar cl">
            <a href="javascript:;">{$page_name}</a>
            <i class="fr" onclick="location.reload()">刷新</i>
        </div>
        <div class="public-form case content ">

            <div >
                <label>请选择一个图像文件:</label>
                <button id="select">(重新)选择图片</button>
                <button id="add">(追加)图片</button>
            </div>
            <div class="container" id="images">
                {if condition="isset($info) and count($info)>0"}
                    {volist name="info" id="val"}
                    <div class="fater" onclick="del_data('{$val.id}',$(this))">
                        <div class="delete">delete</div>
                        <div >
                            <!-- <span class="del" onclick="del_data('{$val.id}',0)">X</span> -->
                            <img  class="float2" src="{$val['image_path']}">
                        </div>
                    </div>
                    {/volist}
                {/if}
            </div>
            <div class="public-btn" id="submit">提交</div>
            <form action="{:url('photo/uploads')}" method="post" enctype="multipart/form-data" id="form2">
                <input type="hidden" name="id" value="{$id}">
                <input type="file" name="up_img[]" id="file_input" style="display:none" multiple="multiple"> <!--用input标签并选择type=file,记得带上multiple,不然就只能单选图片了-->
            </form>
        </div>
        
    </body>
</html>

后端代码(伪代码)

public function uploads(){

    if (empty($this->file)) {
        $this->file = isset($_FILES) ? $_FILES : [];
    }
    //后台代码随便写就行
    
    //保存返回成功即可
    $data = ['code'=>1,'msg'=>'保存成功'];
    return $data;
}

后端的代码就随意了, 自己写下吧, 嘿嘿
喜欢的点赞收藏, 感谢

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容