PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析

5年以前  |  阅读数:944 次  |  编程语言:PHP 

文件上传分为两个部分,HTML显示部分和PHP处理部分,HTML部分主要是让用户来选择所要上传的文件,然后通过PHP中的$_FILES,我们可以把文件上传到服务器的指定目录。

1.客户端页面

客户端的配置

1.表单页面

2.表单发送方式为post

3.表单form中添加enctype="multipart/form-data"

    <body>
     <form action="doaction.php" method="post" enctype="multipart/form-data">
     <input type="file" name="myfile">
     <input type="submit" value="上传">
     </form>
    </body>

2.处理页面doaction

$_FILES:文件上传变量

print_r($_FILES);

$_FILES:保存着上传文件的信息

1.name:上传文件的名称

2.type:上传文件的MIME类型

3.tmp_name:上传到服务器上的临时文件名

4.size:上传文件的大小

5.error:上传文件的错误号


    $filename=$_FILES['myfile']['name'];
    $type=$_FILES['myfile']['type'];
    $tmp_name=$_FILES['myfile']['tmp_name'];
    $size=$_FILES['myfile']['size'];
    $error=$_FILES['myfile']['error'];

将服务器上的临时文件移动到指定文件夹

1.move_uploaded_file(临时文件名,'文件夹名'.$filename); 将服务器上的临时文件移动到指定文件夹,叫什么名字($filename),移动成功返回true,移动失败返回false。


    move_uploaded_file($tmp_name,"wenjian/".$filename);

2.copy("临时文件名","文件名".$filename) 将服务器上的临时文件拷贝到指定文件夹

文件上传配置


    file_uploads = on,支持HTTP上传
    upload_tmp_dir= ,临时文件保存的目录
    upload_max_filesize=2M,允许上传文件的最大值
    max_file_uploads=20,允许一次上传的最大文件数
    post_max_size=8M,post方式发送数据的最大值

3.错误信息处理

上传文件失败时,判断一下错误号,只有为0或者UPLOAD_ERR_OK,才没有错误发生,上传成功

下面是抓取错误


    if($error==UPLOAD_ERR_OK)
    {
      if(move_uploaded_file($tmp_name,"wenjian/".$filename))
      {
        echo "文件".$filename."上传成功";
        }else
        {
          echo "文件".$filename."上传失败";
          }
      }
      else
      {
        //匹配错误信息
        switch($error)
        {
          case 1:
          echo "上传文件超过了PHP配置文件中upload_max_filesize选项的值";
          break;
          case 2:
          echo "超过了表单MAX_FILE_SIZE的限制大小";
          break;
          case 3:
          echo "文件部分被上传";
          break;
          case 4:
          echo "没有选择上传文件";
          break;
          case 6:
          echo "没有找到临时目录";
          break;
          case 7:
          case 8:
          echo "系统错误";
          break;
          }
        }
    ?>

4.上传文件限制

《客户端限制:》

通过表单隐藏域限制上传文件的最大值


    <input type="hidden" name="MAX_FILE_SIZE" value="字节数">

通过accept属性限制上传文件的类型


    <input type="file" name="myfile" accept="文件的MIME类型">

《服务器端限制》

1.限制上传文件大小

2.限制上传文件类型

3.检测是否为真实图片类型

4.检测是否为HTTP POST方式上传

5.判断服务器上存储的文件夹在不在

6.防止重名产生覆盖


    <?php
    $fileinfo=$_FILES["myfile"];
    $maxsize=2097152;     //写最大的字节数,自己算
    $allowext=array('jpeg','jpg','pnd','gif','wbmp');  //定义一下允许的上传文件类型
    //1.判断错误号
    if($fileinfo['error']==0)
    {
      //1.判断上传文件大小
    if($fileinfo['size']>$maxsize)
      {
        exit('上传文件过大');
        }
     //2.判断上传文件类型是不是在规定类型中
    $ext=strtolower(end(explode(',',$fileinfo['name'])));//截取上传文件扩展名
      if(!in_array($ext,$allowext))  // 判断上传文件的扩展名是不是在定义类型中
      {
         exit('非法文件类型');  
        }
     //3.判断文件是否是通过HTTP POST方式上传上来的
    if(!is_uploaded_file($fileinfo['tmp_name']))
      {
        exit('文件不是通过HTTP POST方式上传上来的');
        }
     //4.检测是否为真实的图片类型,而不是认为改动的
    $flag=true;
      if($flag)
      {
        if(!getimagesize($fileinfo['tmp_name']))
        {
          echo "不是真实的图片类型";
          }
        }
      $path='uploads'; //服务器上存储文件的文件名
    //5.判断服务器上存储的文件夹在不在
    if(!file_exists($path))
      {
        mkdir($path,0777,true);//不存在就创建一个目录
        chmod($path,0777);//加一个权限
        }
     //6.确保文件名唯一,防止重名产生覆盖
    $uniname=md5(uniqid(microtime(true),true)).'.'.$ext;  //通过MD5加密等措施给文件名取名
      $destination=$path.'/'.$uniname;
      if(move_uploaded_file($fileinfo['tmp_name'],$destination)) //上传文件
      {
        echo "文件上传成功";
        }else
        {
          echo "文件上传失败";
          }
      }else
      {
    //匹配错误信息
      switch($error)
        {
          case 1:
          echo "上传文件超过了PHP配置文件中upload_max_filesize选项的值";
          break;
          case 2:
          echo "超过了表单MAX_FILE_SIZE的限制大小";
          break;
          case 3:
          echo "文件部分被上传";
          break;
          case 4:
          echo "没有选择上传文件";
          break;
          case 6:
          echo "没有找到临时目录";
          break;
          case 7:
          case 8:
          echo "系统错误";
          break;
          }
        }
    ?>

5.完整的上传文件步骤

第一步:表单页内容


    <body>
     <form action="doaction.php" method="post" enctype="multipart/form-data">
    //通过表单隐藏域限制上传文件的最大值
    <input type="hidden" name="MAX_FILE_SIZE" value="字节数">
    //通过accept属性限制上传文件的类型
    <input type="file" name="myfile" accept="文件的MIME类型">
    </form>
     </body>

第二步:处理界面。定义变量


    <?php
    //$_FILES:文件上传变量
    print_r($_FILES);
    //$_FILES:保存着上传文件的信息
    /*1.name:上传文件的名称
    2.type:上传文件的MIME类型
    3.tmp_name:上传到服务器上的临时文件名
    4.size:上传文件的大小
    5.error:上传文件的错误号*/
    $filename=$_FILES['myfile']['name'];
    $type=$_FILES['myfile']['type'];
    $tmp_name=$_FILES['myfile']['tmp_name'];
    $size=$_FILES['myfile']['size'];
    $error=$_FILES['myfile']['error'];

第三步:处理页面上服务器加限制和输出错误信息

1.限制上传文件大小

2.限制上传文件类型

3.检测是否为真实图片类型

4.检测是否为HTTP POST方式上传

5.判断服务器上存储的文件夹在不在

6.防止重名产生覆盖


    //服务器端限制
    <?php
    $fileinfo=$_FILES["myfile"];
    $maxsize=2097152;     //写最大的字节数,自己算
    $allowext=array('jpeg','jpg','pnd','gif','wbmp');  //定义一下允许的上传文件类型
    //1.判断错误号
    if($fileinfo['error']==0)
    {
      //1.判断上传文件大小
    if($fileinfo['size']>$maxsize)
      {
        exit('上传文件过大');
        }
     //2.判断上传文件类型是不是在规定类型中
    $ext=strtolower(end(explode(',',$fileinfo['name'])));//截取上传文件扩展名
      if(!in_array($ext,$allowext))  // 判断上传文件的扩展名是不是在定义类型中
      {
         exit('非法文件类型');  
        }
     //3.判断文件是否是通过HTTP POST方式上传上来的
    if(!is_uploaded_file($fileinfo['tmp_name']))
      {
        exit('文件不是通过HTTP POST方式上传上来的');
        }
     //4.检测是否为真实的图片类型,而不是认为改动的
    $flag=true;
      if($flag)
      {
        if(!getimagesize($fileinfo['tmp_name']))
        {
          echo "不是真实的图片类型";
          }
        }
      $path='uploads'; //服务器上存储文件的文件名
    //5.判断服务器上存储的文件夹在不在
    if(!file_exists($path))
      {
        mkdir($path,0777,true);//不存在就创建一个目录
        chmod($path,0777);//加一个权限
        }
     //6.确保文件名唯一,防止重名产生覆盖
    $uniname=md5(uniqid(microtime(true),true)).'.'.$ext;  //通过MD5加密等措施给文件名取名
      $destination=$path.'/'.$uniname;
      $destination=inocv("UTF-8","gb2312",$destination); //如果上传的文件名中有汉字,需要转码一下,用inocv函数,把utf-8转为gb2312.
      if(move_uploaded_file($fileinfo['tmp_name'],$destination)) //上传文件
      {
        echo "文件上传成功";
        }else
        {
          echo "文件上传失败";
          }
      }else
      {

第四步:匹配错误信息


    switch($error)
        {
          case 1:
          echo "上传文件超过了PHP配置文件中upload_max_filesize选项的值";
          break;
          case 2:
          echo "超过了表单MAX_FILE_SIZE的限制大小";
          break;
          case 3:
          echo "文件部分被上传";
          break;
          case 4:
          echo "没有选择上传文件";
          break;
          case 6:
          echo "没有找到临时目录";
          break;
          case 7:
          case 8:
          echo "系统错误";
          break;
          }
        }
    ?>

以上所述是小编给大家介绍的PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例