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 相关文章推荐
开发大型PHP项目的方法
Oct 09 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
PHP抓屏函数实现屏幕快照代码分享
Jan 02 PHP
PHP链接MySQL的常用扩展函数
Oct 23 PHP
thinkphp3.2.2前后台公用类架构问题分析
Nov 25 PHP
thinkPHP实现瀑布流的方法
Nov 29 PHP
php中Ctype函数用法详解
Dec 09 PHP
Zend Guard使用指南及问题处理
Jan 07 PHP
PHP单态模式简单用法示例
Nov 16 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
用php定义一个数组最简单的方法
Oct 04 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
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
世界收音机发展史
2021/03/01 无线电
Symfony核心类概述
2016/03/17 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
基于jquery的气泡提示效果
2010/05/31 Javascript
JSON.parse()和JSON.stringify()使用介绍
2014/06/20 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
vue实现通讯录功能
2018/07/14 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
Python 字符串与数字输出方法
2018/07/16 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
python list格式数据excel导出方法
2018/10/31 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
python多线程使用方法实例详解
2019/12/30 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
python numpy数组中的复制知识解析
2020/02/03 Python
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
高二化学教学反思
2014/01/30 职场文书
投标承诺书怎么写
2014/05/24 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书