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


Posted in PHP onJanuary 12, 2017

文件上传分为两个部分,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 相关文章推荐
解析百度搜索结果link?url=参数分析 (全)
Oct 09 PHP
解析PHP提交后跳转
Jun 23 PHP
PHP加密扩展库Mcrypt安装和实例
Nov 10 PHP
访问编码后的中文URL返回404错误的解决方法
Aug 20 PHP
php的sso单点登录实现方法
Jan 08 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
May 12 PHP
深入解析PHP的Yii框架中的event事件机制
Mar 17 PHP
PHP微信支付开发实例
Jun 22 PHP
php 输入输出流详解及示例代码
Aug 25 PHP
PHP观察者模式原理与简单实现方法示例
Aug 25 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
Sep 26 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 PHP
php中分页及SqlHelper类用法实例
Jan 12 #PHP
PHP生成图片验证码功能示例
Jan 12 #PHP
PHP中字符串长度的截取用法示例
Jan 12 #PHP
PHP实现二维数组去重功能示例
Jan 12 #PHP
PHP生成图片缩略图类示例
Jan 12 #PHP
php+redis实现多台服务器内网存储session并读取示例
Jan 12 #PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
Jan 11 #PHP
You might like
浅析is_writable的php实现
2013/06/18 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
VueJs组件之父子通讯的方式
2018/05/06 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
python字典get()方法用法分析
2015/04/17 Python
十个Python程序员易犯的错误
2015/12/15 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
django url到views参数传递的实例
2019/07/19 Python
Flask框架请求钩子与request请求对象用法实例分析
2019/11/07 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
django项目中新增app的2种实现方法
2020/04/01 Python
Python之字典添加元素的几种方法
2020/09/30 Python
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
机械制造与自动化应届生求职信
2013/11/16 职场文书
机房搬迁方案
2014/05/01 职场文书
红头文件任命书范本
2014/06/05 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
公司年夜饭通知
2015/04/25 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript