描述:
本文介绍利用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>