作为一个初入前端的菜鸟,最近因为一个无刷新上传图片问题走了很多弯路,所以在这里给大家分享一下,不足之处希望谅解。无刷新上传图片一般有两种方式,一种是 form 表单+iframe ,还有一种是 ajax ,form表单涉及$_FILES,ajax涉及 base64的编码和解码,个人认为,form 表单的方法要简单很多,所以在这里分享给大家。这里我使用了 HTML5中的 window.FileReader对象来实现图片上传之后的预览效果,使图片不会提前传到服务器的图片文件夹中,关于 window.FileReader对象,大家感兴趣的可以在网上找找,资料很多,这里就不介绍了。下边贴上完整代码:
目录结构
HTML页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <script src="js/jquery-2.1.3.min.js"></script> <script src="js/jquery.form.js"></script> <title>demo</title> <style> .imgShow { width: 200px; height: 60px; border: 1px dotted #ccc; margin-bottom: 15px; } .uploadImg_ { width: 45px; line-height: 25px; color: black; position: relative; border: 1px solid red; padding: 5px; background: rgb(245, 245, 245); border: 1px solid rgb(179, 179, 179); overflow: hidden; } #file { width: 90px; position: absolute; left: 0; top: 0; opacity: 0; } </style> </head> <body> <div> <div class="imgShow"> </div> <form action="upload.php" id="form_" target="myImg" method="post" enctype="multipart/form-data"> <span class="uploadImg_">
<-- multiple:多图上传 files[]代表多图上传 类型是数组 accept:规定上传图片的格式--> <input type="file" id="file" name="files[]" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg" multiple> 上传图片⬆️ </span> </form> <iframe width="" height="" frameborder="1" name="myImg" style="display:none;"></iframe> </div> </body>
js代码
js中要使用jQuery.form.js 来实现 form 表单的回调,这个 js 可以在网上直接下载,这里贴上链接http://plugins.jquery.com/form/
<script> var html_ = ''; var cArr = []; $('#file').change(function() { if (window.FileReader) { for (var i = 0; i < file.files.length; i++) { var ofread = new FileReader(); cArr.push(ofread); } for (var i = 0; i < cArr.length; i++) { cArr[i].readAsDataURL(file.files[i]); cArr[i].onload = function(e) { var result = e.target.result; html_ += '<img class="img_id" src="' + result + '" alt="" />'; $('.imgShow').html(html_); } } } }) var submit = document.querySelector('#submit'); submit.onclick = function() { var form = $('#form_'); var options = { url: 'upload.php', type: 'post', success: function(e) {
//返回来的数据是 json 字符串,直接存入数据库 $.ajax({ type: "POST", url: "data.php", data: { data_: e }, datatype: "json", success: function(data) { $('.imgShow').html(null); html_ = ''; cArr = []; }, error: function() { //请求出错处理 } }); } }; form.ajaxSubmit(options); } </script>
php 上传图片
<?php $src=$_FILES['files']['tmp_name']; $file=$_FILES['files']['name']; $arr=[]; $dataArr; for($i=0;$i<count($file);$i++){ $file_=explode('.',$file[$i]); $ext=array_pop($file_); $rand=time().mt_rand().'.'.$ext; $dst="img/$rand"; array_push($arr,$dst); $dataArr=json_encode($arr); if($_FILES['files']['error'][$i]===0){ move_uploaded_file($src[$i],$dst); } } echo $dataArr;