文件上传(图)

文件上传(图)

描述:

本文介绍利用ajax上传图片实现预览,并保存路径,form表单无须使用enctype="multipart/form-data"。

原理:

浏览文件请求上传图片接口upload,上传成功返回数据保存在隐藏的input内,并命名为字段名称image,最后表单保存来存储数据。

代码如下(本文使用thinkphp5.0框架作演示):

上传接口代码:

1,控制器代码

/**
 * 上传图片
 * @return
 * status  上传状态 1成功0失败
 * msg     返回上传消息
 * file_id 上传图片文件id
 * url     上传图片返回路径
 */
public function upload(){
    return model('admin/File')->uploadImg();
}

2,模型代码

/**
    * 上传图片
    * @return
    * status  上传状态 1成功0失败
    * msg     返回上传消息
    * file_id 上传图片文件id
    * url     上传图片返回路径
    */
public function uploadImg($file='file',$location='admin'){
   // 获取表单上传文件 例如上传了001.jpg
   if (!empty($_FILES[$file]['name'])){
      $file = request()->file($file);
      // 移动到框架应用根目录/public/uploads/ 目录下
      $info = $file->validate(['size'=>1024*2*1000,'ext'=>'jpg,png,gif'])->move(ROOT_PATH . 'public' . DS . 'uploads'. DS . $location);
           if($info){
         // 成功上传后 获取上传信息
         $data['url']='/uploads/'.$location.'/'.str_replace('\\','/',$info->getSaveName());
         $data['original']='/uploads/'.$location.'/'.str_replace('\\','/',$info->getSaveName());
         $data['ext']=$info->getExtension();
         $data['size']=$info->getSize();
         $data['create_time']=time();
         $rs=Db::name('file')->insertGetId($data);
         if ($rs>0){
            $msg['status']='1';
            $msg['msg']='上传成功';
            $msg['file_id']=$rs;
                   $msg['url']=$data['url'];
            return $msg;
         }else{
            $msg['status']='0';
            $msg['msg']='上传失败';
            return $msg;
         }
      }else{
         // 上传失败获取错误信息
         $msg['status']='0';
         $msg['msg']=$file->getError();;
         return $msg;
      }
   }
}

3,html代码

<!--1、input框-->
<input type="text" readonly="readonly" name="image" value="" class="image0 tpl-form-input">
<!--2、浏览选择图片-->
<input type="file"  class="file input-file" number="0" class="file input-file" multiple="multiple" class="tpl-form-input">
<!--3、预览按钮-->
<a type="button" href="javascript:void(0);" class="image0">预览</a>
<!--上传后的预览小图-->
<img src="" class="img0" style="max-width: 30px; max-height: 30px;" />

4,javascript代码

<script>
//上传图片
    $(document).on('change',".file",function(){
        var obj=this;
        var action = "{:url('kbcms/admin_upload/upload')}";
        var file=obj.files[0];
        var xhr = new XMLHttpRequest();
        xhr.open("post", action, true); // 上传地址
        xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                if (xhr.status == 200) {
                    var str = $.parseJSON(xhr.responseText); // 返回格式,此处为json,可以为别的格式
                    if (str.status==1){
                        var objUrl = getObjectURL(file) ;
                        //console.log("objUrl = "+objUrl) ;
                        var num=$(obj).attr("number");
                        if (objUrl) {
                            $(".img"+num).attr("src", objUrl);
                            $(".image"+num).val(str.url);
                            $(".image"+num).attr('href',str.url);
                            $(".image"+num).attr('target','_blank');
                            //target="_blank"
                        }
                    }else{
                        alert(str.msg);
                    }
                }
            }
        }
        var fd = new FormData();
        fd.append('file', file);
        xhr.send(fd);
    }) ;
    //建立一個可存取到該file的url
    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 ;
    }
</script>



回复列表


回复操作