zoukankan      html  css  js  c++  java
  • JS/PHP-表单文件域上传文件和PHP后台处理

    表单文件域上传文件和PHP后台处理

    1.html代码部分:

      form表单中,chechbox,radios,文件域,下拉框等不能修改样式组件的样式,所以为了好看要先修改他们的样式

      基本思路:

    • 首先通过label绑定input:avatar,然后让input:avatar display:none。这样点击label就能选中文件域了
    • 然后添加img和i标签,img是用来提交头像后显示在此处,而i是用来在img空的时候做遮挡层的
    • 修改img和i的样式,令他们有长宽
    • 最后要写一个input:hidden,这是隐藏域,用来不会在页面显示但可以随表单提交数据,这里可以把用户提交的头像保存的地址通过表单提交到后台

          <form class="form-horizontal" method="post" action="/admin/users-add.php">
            <div class="form-group">
              <label class="col-sm-3 control-label">头像</label>
              <div class="col-sm-6">
                <!--这里的头像框改变了文件提交按钮的默认样式-->
                <label class="form-image">
                  <input id="avatar" type="file">
                  <img src="http://baixiu.test/static/assets/img/default.png">
                <!--隐藏域:看不见的文本框,作用是用来提交键值-->
                  <input type="hidden" name="avatar">
                  <i class="mask fa fa-upload"></i>
                </label>
              </div>
            </div>
        </form>
    

      

    2.js代码部分:

      重点是通过FormData()这个对象来将文件转化为键和二进制的数据的格式

          //关于表单文件域的使用,文件域有文件提交时也是触发change事件的。
          //对input:file元素来说,提交的文件是保存在DOM属性files中,可以通过这个属性判断有没有提交,以及获得提交的元素
          $('#avatar').on('change',function () {
              //当文件选择状态变化会执行这个事件处理函数
              var $this = $(this);
              var files = $(this).prop('files');
              //如果length为0,说明未提交文件
              if(!files.length){
                  return ;
              }
              //拿到用户提交的文件
              var file = files[0];
              //异步文件上传============================================================
              //FormData是HTML5新增的一个成员,专门配合ajax操作,用于在客户端和服务端之间传递二进制数据
              var data = new FormData();
              //保存为键值的方式
              data.append('avatar',file);
              //通过ajax发送到服务端,这里通过未封装的ajax比较方便,用jq反而不方便
              var xhr = new XMLHttpRequest();
              xhr.open('POST','/admin/api/upload.php');
              xhr.send(data); //将二进制形式的文件发送到后台
    
              xhr.onload = function () {
                  // console.log(this.responseText);
                  $this.siblings('img').attr('src',this.responseText);
                  $this.siblings('input').val(this.responseText);
              }
          })
      </script>
    

     

     

    3.PHP后台代码部分:

      这部分首先用$_FILES接收键为avatar的数据,并了解其中每项的意义

      判断是否上传成功,然后将文件保存在新地址中

      返回给客户端这个地址,客户端就能通过这个地址将对应地址的图片显示在img标签中&新增数据库的用户

      

    <?php
    //服务端要做的事情
    //接收文件
    //保存文件
    //返回这个文件访问url
    
    if(empty($_FILES['avatar'])){
        exit('必须上传文件');
    }
    
    $avatar = $_FILES['avatar'];
    //传递过来的是avatar为键,二进制内容为值的键值对,但如果直接打印值的话是一个关联数组
    //array(5) {
    //    ["name"]=>
    //  string(12) "widget_5.jpg"    客户端文件的原名称。
    //    ["type"]=>
    //  string(10) "image/jpeg"      文件的 MIME 类型,需要浏览器提供该信息的支持
    //    ["tmp_name"]=>
    //  string(27) "C:WindowsTempphp68F1.tmp"    文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定
    //    ["error"]=>                   和该文件上传相关的错误代码
    //  int(0)
    //  ["size"]=>                   已上传文件的大小,单位为字节。
    //  int(28658)
    //}
    //判断文件是否上传成功,只有$avatar['error']等于UPLOAD_ERR_OK,才表示上传成功
    //UPLOAD_ERR_OK
    //值:0; 没有错误发生,文件上传成功。
    //UPLOAD_ERR_INI_SIZE
    //值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
    //UPLOAD_ERR_FORM_SIZE
    //值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
    //UPLOAD_ERR_PARTIAL
    //值:3; 文件只有部分被上传。
    //UPLOAD_ERR_NO_FILE
    //值:4; 没有文件被上传。
    //值:5; 上传文件大小为0.
    if($avatar['error'] !== UPLOAD_ERR_OK){
        exit('文件上传失败');
    }
    //校验类型,大小
    
    //移动文件到网站范围之外
    //pathinfo() 返回一个关联数组包含有 path 的信息。比如:
    //Array
    //(
    //      [dirname] => /testweb
    //      [basename] => test.txt
    //      [extension] => txt
    //)
    //这里就获取图片文件名的后缀=>jpg
    $ext = pathinfo($avatar['name'] , PATHINFO_EXTENSION);
    
    //uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。
    //拼接出一个新地址
    $target = '../../static/uploads/img-' . uniqid() . '.' . $ext;
    
    //move_uploaded_file将上传的文件移动到新位置。若成功,则返回 true,否则返回 false。
    if(!move_uploaded_file($avatar['tmp_name'] , $target)){
        exit('上传失败');
    }
    
    //上传成功,根据实际需要截取下地址字符串
    echo substr($target,5);
    

      

  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/Helen-code/p/12514628.html
Copyright © 2011-2022 走看看