黑帽联盟

 找回密码
 会员注册
查看: 2180|回复: 0
打印 上一主题 下一主题

[php] php+html5实现无刷新图片上传教程

[复制链接]
yun 黑帽联盟官方人员 

920

主题

37

听众

1364

积分

超级版主

Rank: 8Rank: 8

  • TA的每日心情
    奋斗
    2019-10-18 11:20
  • 签到天数: 678 天

    [LV.9]以坛为家II

    向大家介绍一种全新的上传图片的方式,利用html5的FileReader读取图片文件,然后将数据传输到服务器再使用PHP进行处理。实现过程如下(带图片预览功能)
    前端html代码 upload,html
    1. <!DOCTYPE html>
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4.   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    5. <title>上传</title>
    6. <script type="text/javascript" src="js/jquery.min.js"></script>
    7. <style>
    8. .upload{
    9.   width:300px;
    10.   height:200px;
    11.   position:relative;
    12. }
    13. .upload input[type='file']{
    14.   position:absolute;
    15.   width:70px;
    16.   top:0;
    17.   left:0;
    18.   z-index:10;
    19.   opacity:0;
    20.   filter:alpha(opacity=0);
    21. }
    22. .upload input.selbutton{
    23.   width:70px;
    24.   height:30px;
    25.   background:#cf001b;
    26.   color:#FFF;
    27.   font-size:14px;
    28.   position:absolute;
    29.   top:0;left:0;
    30.   z-index:9;
    31.   border:none;
    32.   cursor:pointer;
    33. }
    34. .upload input.upbutton{
    35.   width:70px;
    36.   height:30px;
    37.   background:#cf001b;
    38.   color:#FFF;
    39.   font-size:14px;
    40.   position:absolute;
    41.   top:50px;left:0;
    42.   z-index:10;
    43.   border:none;
    44.   cursor:pointer;
    45. }
    46. </style>
    47. </head>
    48. <body>
    49. <div class='upload'>
    50.   <input type="file" name="file" />
    51.   <input type="button" name="selbutton" class="selbutton" value="选择文件" />
    52.   <input type="button" name="upbutton" class="upbutton" value="上传" />
    53. </div>
    54. <div class='previews'>
    55.   <img src="#" class="image_thumb" alt="图片预览"/>
    56. </div>
    57. </body>
    58. </html>
    复制代码
    样式如下图
    2.png
    接下来是js代码
    1. <script type="text/javascript">
    2.   $(".upbutton").click(function(){
    3.     //定义允许上传的图片格式 在前台就可以直接判断,不合法的格式将不会上传
    4.    var filetype = ['jpg','jpeg','png','gif'];
    5.    if($('.image').get(0).files){
    6.       fi = $('.image').get(0).files[0]; //得到文件信息
    7.       //判断文件格式是否是图片 如果不是图片则返回false
    8.       var fname = fi.name.split('.');
    9.       if(filetype.indexOf(fname[1].toLowerCase()) == -1){
    10.         alert('文件格式不支持');
    11.         return ;
    12.       }
    13.       //实例化h5的fileReader
    14.       var fr = new FileReader();
    15.       fr.readAsDataURL(fi); //以base64编码格式读取图片文件
    16.       fr.onload = function(frev){
    17.         pic = frev.target.result; //得到结果数据
    18.       //开始上传之前,预览图片
    19. $('.image_thumb').attr('src',pic);
    20. //使用ajax 利用post方式提交数据
    21.         $.post(
    22.           'handle.php',
    23.           {
    24.              message:pic,
    25.             filename:fname[0],
    26.             filetype:fname[1],
    27.             filesize:fi.size
    28.           },
    29.           function(data){
    30.             data = eval('('+data+')');
    31.             if(data.code == 1 || data.code == 2){
    32.               console.log('上传失败')
    33.             }else if(data.code == 0){
    34.               console.log('上传成功')
    35.             }
    36.           }
    37.         );
    38.       }
    39.     }
    40.   })
    41. </script>
    复制代码
    接下来是PHP处理代码  handle.php
    1. $imgtype = array(
    2.   'gif'=>'gif',
    3.   'png'=>'png',
    4.   'jpg'=>'jpeg',
    5.   'jpeg'=>'jpeg'
    6. ); //图片类型在传输过程中对应的头信息
    7. $message = $_POST['message']; //接收以base64编码的图片数据
    8. $filename = $_POST['filename']; //接收文件名称
    9. $ftype = $_POST['filetype']; //接收文件类型
    10. //首先将头信息去掉,然后解码剩余的base64编码的数据
    11. $message = base64_decode(substr($message,strlen('data:image/'.$imgtype[strtolower($ftype)].';base64,')));
    12. $filename = $filename.".".$ftype;
    13. $furl = "D:/now/";
    14. //开始写文件
    15. $file = fopen($furl.$filename,"w");
    16. if(fwrite($file,$message) === false){
    17.   echo json_encode(array('code'=>1,'con'=>'failed'));
    18.   exit;
    19. }
    20. echo json_encode(array('code'=>0,'con'=>$filename));
    复制代码
    选择文件然后点击上传的效果如下图
    1.png

    以上就是整个图片上传的代码。当然对于PHP的部分还有很多可以优化的地方,比如文件名部分,可以重命名,以保证相同文件名上传以后的文件名是不同的等等。这种上传方式我也是刚开始使用,当初是受Node.js做上传的的启发,然后尝试着应用于PHP,没想到还真能上传成功。
    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部