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 相关文章推荐
关于时间计算的结总
Dec 06 PHP
[原创]效率较高的php下读取文本文件的代码
Jul 02 PHP
PHP教程 变量定义
Oct 23 PHP
PHP 5.3新特性命名空间规则解析及高级功能
Mar 11 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
Sep 13 PHP
PHP 自定义错误处理函数trigger_error()
Mar 26 PHP
解析zend Framework如何自动加载类
Jun 28 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
Nov 04 PHP
php线性表的入栈与出栈实例分析
Jun 12 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
ZendFramework框架实现连接两个或多个数据库的方法
Dec 08 PHP
深入学习微信网址链接解封的防封原理visit_type
Aug 15 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
功能强大的php分页函数
2016/07/20 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
进一步了解Python中的XML 工具
2015/04/13 Python
Python中文件操作简明介绍
2015/04/13 Python
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
Python环境变量设置方法
2016/08/28 Python
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
Pamela Love官网:纽约设计师Pamela Love的精美、时尚和穿孔珠宝
2020/10/19 全球购物
机电专业毕业生推荐信
2013/11/10 职场文书
教职工代表大会主持词
2014/04/01 职场文书
教室标语大全
2014/06/21 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python