$.ajax--异步表单文件上传:
1.除了传统的表单提交方式,然而传统方式已经不再满足客户需求 ,需要更好的体验,那么采用jQuery中的 $.ajax()来实现表单文件的上传。当然对于初学者 有太多的坑,话不多说 有图有真相,
1.1先附上 前端文件源码
实例
<!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="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <script src="http://apps.bdimg.com/libs/layer/2.1/layer.js" type="text/javascript" charset="utf-8"></script> <title>实战:文件上传</title> <style type="text/css"> *{margin: 0;padding: 0;} body{ background: url(../../images/2.jpg)no-repeat; overflow: hidden;background-size:500% ;background-position-y:-200px; } .container{ height: 600px; width: 500px; background-color: rgba(0,0,0,0.5); margin: 100px auto; border-radius: 10px; margin-top: 250px; } img{ display: block; width: 360px; height: 400px; background-color: aquamarine; margin: 30px auto; box-shadow: 5px 5px 1px #8E8C8C; border-radius:10px ; } h2{ text-align: center; color: white;padding-top:20px ; } .btn{ width: 150px;height: 30px; background: coral;border: none; border-radius: 3px;color: white; margin-left: 66px; cursor: pointer; } .btn:hover{ font-size: 1.02em; background: orange; } </style> </head> <body> <!-- 作者:1083396620@qq.com 时间:2018-04-19 描述: 实战之前我们先来学习下一个系统函数 $_FILES 该函数是一个二维数组 一维就是要上传的表单name的属性 二维重要的有以下几个数组元素 $_FILES['input中name属性']['name'] 1.$_FILES['file']['name'] 上传文件的名称 2.$_FILES['file']['type'] 上传文件的类型 3.$_FILES['file']['size'] 上传文件的大小 4.$_FILES['file']['tmp_name'] 上传文件的临时文件夹 5.$_FILES['file']['error'] 错误信息 --> <div class="container"> <h2>头像预览</h2> <div class="pic"> <img src="../../php中文网练习/jQuery/images/7.png" /> </div> <form id="info" enctype="multipart/form-data" onsubmit="return false"> <p><input type="file" name="file" id="file" value="" /></p> <p><input type="hidden" name="MAX_FILE_SIZE" id="hide" value="512042488" /></p> <p><input type="submit" name="button" id="button"class="btn" value="上传图片" /> <input type="reset" name="reset" id="reset" class="btn" value="重新填写" /></p> </form> </div> </body> <script type="text/javascript"> $(function(){ $('#button').click(function(){ // 1.使用html5中的方法 FormData对象方法提交表单数据 //创建空对象 var formdata = new FormData($('#info')[0]) //传入参数 // formdata.append('file',$('#file').val()) // formdata.append('MAX_FILE_SIZE',$('#hide').val()) $.ajax({ url:'requied.php', type: 'POST', data:formdata, dataType:'json', contentType: false,//禁止设置请求类型 processData:false,// 禁止jq对数据的处理 因为在FormData对象中已经处理了 success:function(res){ switch (res.status){ case '200': layer.tips(res.msg, '.pic img', { tips: [1, '#3595CC'], time: 8000 }); break; case '1': layer.tips(res.msg, '.pic img', { tips: [1, '#3595CC'], time: 8000 }); var index = layer.load(0, {shade: false}); break; case '2': layer.tips(res.msg, '.pic img', { tips: [1, '#3595CC'], time: 8000 }); break; case '3': layer.tips(res.msg, '.pic img', { tips: [1, '#3595CC'], time: 8000 }); break; case '4': layer.tips(res.msg, '.pic img', { tips: [1, '#3595CC'], time: 8000 }); var index = layer.load(0, {shade: false}); break; case '6': layer.tips(res.msg, '.pic img', { tips: [1, '#3595CC'], time: 8000 }); break; case '7': layer.tips(res.msg, '.pic img', { tips: [1, '#3595CC'], time: 8000 }); break; case '8': layer.tips(res.msg, '.pic img', { tips: [1, '#3595CC'], time: 8000 }); break; case '5': layer.tips(res.msg, '.pic img', { tips: [1, '#3595CC'], time: 8000 }); break; default: layer.tips('未知错误', '.pic img', { tips: [1, '#3595CC'], time: 8000 }); break; } $('.pic img').attr('src', '/php/0419/upload/'+res.src); } }) }) }) </script> </html>
运行实例 »
点击 "运行实例" 按钮查看在线实例
1.2 对于html有一个槽点 就是一定要采用submit提交 一定要禁用 默认事件 enctype 一定要是multipart/form-data
<form id="info" enctype="multipart/form-data" onsubmit="return false"> 在php中获取不到$_FILES 超级变量就是这个没有设置好
1.3js中 采用h5中新增的方法 FormData 方法 详细使用方法请百度
2.php代码 不太完善还可以增加上传文件大小判断等 看代码
实例
<?php //请求传递方式是否为post if($_SERVER['REQUEST_METHOD']=='POST') { //检测文件是否被上传 if(isset($_FILES['file'])){ //设置文件上传的类型 $images = ['image/png','image/jpg','image/jpeg']; //p判断是否在数组中 if(in_array($_FILES['file']['type'], $images)){ //将文件移动到临时目录并移动到上传目录 if(move_uploaded_file($_FILES['file']['tmp_name'],"upload/{$_FILES['file']['name']}")){ echo json_encode(['status'=>'200','msg'=>'恭喜你!!!文件上传成功','src'=>"{$_FILES['file']['name']}"]); } }else{ exit (json_encode(['status'=>'5','msg'=>'文件类型不正确,请重新上传'])); } } if($_FILES['file']['error'] > 0){ switch ($_FILES['file']['error']) { case '1': echo json_encode(['status'=>'1','msg'=>'很遗憾!!!文件超过了php.ini配置中设置的大小']); break; case '2': echo json_encode(['status'=>'2','msg'=>'很遗憾!!!文件超过了表单中常量设置的大小']); break; case '3': echo json_encode(['status'=>'3','msg'=>'很遗憾!!!仅有部分文件被上传']); break; case '4': echo json_encode(['status'=>'4','msg'=>'很遗憾!!!没有文件被上传']); break; case '6': echo json_encode(['status'=>'6','msg'=>'很遗憾!!!没有可用的临时文件夹']); break; case '7': echo json_encode(['status'=>'7','msg'=>'很遗憾!!!磁盘已满,写入失败']); break; case '8': echo json_encode(['status'=>'8','msg'=>'很遗憾!!!上传意外中止']); break; default: echo json_encode(['status'=>'9','msg'=>'很遗憾!!!文件上传失败 ,返回未知错误']); break; }; }; }else{ echo '<pre>'; exit(json_encode(['status'=>'404',"当前的请求方式是:{$_SERVER['REQUEST_METHOD']}"])); }; ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例