js动态选择图片上传(带缩略图,可上传多张),在thinkphp框架中的整合(使用内置的upload类)

前几天因为要做上传新闻的项目,而且是多文件上传。就学了一下thinkphp多文件上传,和前端的js动态获取本地图片。


这是效果图,还可以实现图片删除功能。

这一段是在网上找的前端js代码

<script type="text/javascript">
    window.onload = function(){
        // alert("hello world");
        var input = document.getElementById("file_input");
        var result;
        var dataArr = []; // 储存所选图片的结果(文件名和base64数据)
        var fd=new FormData();;  //FormData方式发送请求
        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(){
            // alert("666");
            var iLen = this.files.length;
            console.log("长度:   "+this.files.length);
            var index = 0;
            for(var i=0;i<iLen;i++){
                if (!input['value'].match(/.jpg|.gif|.png|.bmp|.jpeg/i)){  //判断上传文件格式,只能是图片
                    return alert("上传的图片格式不正确,请重新选择");
                }

                var reader = new FileReader();
                reader.index = i;
                fd.append("file[]",this.files[i]);
                reader.readAsDataURL(this.files[i]);  //转成base64
                reader.fileName = this.files[i].name;


                reader.onload = function(e){
                    var imgMsg = {
                        name : this.fileName,//获取文件名
                        base64 : this.result   //reader.readAsDataURL方法执行完后,base64数据储存在reader.result                    }
                    dataArr.push(imgMsg);
                    result = '<div class="delete">delete</div><div class="result"><img src="'+this.result+'" alt=""/></div>';
                    var div = document.createElement('div');
                    div.innerHTML = result;
                    div['className'] = 'float';
                    div['index'] = index;
                    document.getElementsByClassName("img-container")[0].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();                  // 在页面中删除该图片元素
                        delete dataArr[this.index];  // 删除dataArr对应的数据

                    }
                    index++;
                }
            }
        }


        function send(){


            var submitArr = [];

            for (var i = 0; i < dataArr.length; i++) {
                if (dataArr[i]) {
                    submitArr.push(dataArr[i]);
                }
            }
            console.log('提交的数据:'+fd);
            $.ajax({
                url : "{:U('school/school_news_img')}",
                type : 'POST',
                data : fd,
                dataType: 'json',
                processData: false,   //FormDatafd时需有这两项
                contentType: false,
                success : function(res){
                    console.log(res.data[0].savename);
                    if(res.info=="2")
                    {
                        $("#info_container").show();
                        $("#danger_container").hide();
                        $("#submit").attr("disabled", true);
                        var str_json = new Array();
                        for(var i=0;i<res.data.length;i++)
                        {
                            str_json[i] = res.data[i].savename;
                        }
                        var data2 = JSON.stringify(str_json);
                        $("#hid_img").val(data2);
                        console.log($("#hid_img").val());

                    }else if(res.info=="1")
                    {

                        $("#danger_container").show();
                        $("#info_container").hide();
                    }
                    // console.log('返回的数据:'+JSON.stringify(data))
                },

            })
        }




        oSelect.οnclick=function(){
            oInput.value = "";   // 先将oInput值清空,否则选择图片与上次相同时change事件不会触发
            //清空已选图片
            $('.float').remove();
            fd = new FormData();
            index = 0;
            oInput.click();
        }


        oAdd.οnclick=function(){
            oInput.value = "";   // 先将oInput值清空,否则选择图片与上次相同时change事件不会触发
            oInput.click();
        }


        oSubmit.οnclick=function(){
            if(!dataArr.length){
                return alert('请先选择文件');
            }
            send();
        }
    }
    /*
     ajax发送fd参数时要告诉jQuery不要去处理发送的数据,
     不要去设置Content-Type请求头才可以发送成功,否则会报“Illegal invocation”的错误,
     也就是非法调用,所以要加上“processData: false,contentType: false,”
     * */


    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;
        }
    }

</script>






至于后台代码:

public function school_news_img()
{

    $config = array(
        'maxSize' => 3145728,
        'rootPath' => './Public/resource/i/',
        'savePath' => '',
        'saveName' => array('uniqid',''),
        'exts' => array('jpg', 'gif', 'png', 'jpeg'),
        'autoSub' => false,//这里并没有将上传的图片制动添加父类目录
        'subName' => array('date','Ymd'),

    );
    $upload = new Upload($config);
    $info = $upload->upload();
    if (!$info) {// 上传错误提示错误信息
        $data['info'] = "1";
        $this->ajaxReturn( $data);

    } else {// 上传成功
        $data['info'] = "2";
        $data['data'] = array();
        $data['data'] = $info;
        $this->ajaxReturn($data); //如果上传成功了就会将上传成功的文件名返回到原页面,实现图片的异步上传
    }

}


版权声明:本文为lingyu2333原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。