说明

这篇是针对之前php知识的补充内容

1、 PHP目录处理函数

处理文件夹的基本思想如下:

1.读取某个路径的时候判断是否是文件夹

2.是文件夹的话,打开指定文件夹,返回文件目录的资源变量

3.使用readdir读取一次目录中的文件,目录指针向后偏移一次

4.使用readdir读取到最后,没有可读的文件返回false

5.关闭文件目录

我们来学习一比常用函数:

函数名 功能
opendir 打开文件夹,返回操作资源
readdir 读取文件夹资源
is_dir 判断是否是文件夹
closedir 关闭文件夹操作资源
filetype 显示是文件夹还是文件,文件显示file,文件夹显示dir
<?php
//设置打开的目录是D盘
$dir = "d:/"; //判断是否是文件夹,是文件夹
if (is_dir($dir)) {
if ($dh = opendir($dir)) { //读取到最后返回false,停止循环
while (($file = readdir($dh)) !== false) {
echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "<br />";
} closedir($dh);
}
}
?>

2、 PHP文件权限设置

chmod 主要是修改文件的的权限

<?php
//修改linux 系统/var/wwwroot/某文件权限为755
chmod("/var/wwwroot/index.html", 755);
chmod("/var/wwwroot/index.html", "u+rwx,go+rx");
chmod("/somedir/somefile", 0755);
?>

3、 PHP文件路径函数

我们经常会遇到处理文件路径的情况。

例如:

1.文件后缀需要取出来

2.路径需要取出名字不取目录

3.只需要取出路径名中的目录路径

4.或者把网址中的各个部份进行解析取得独立值

5.甚至是自己组成一个url出来

... ....

很多地方都需要用路径处理类的函数。

我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可:

函数名 功能
pathinfo 返回文件的各个组成部份
basename 返回文件名
dirname 文件目录部份
parse_url 网址拆解成各部份
http_build_query 生成url 中的query字符串
http_build_url 生成一个url
<?php
$path_parts = pathinfo('d:/www/index.inc.php'); echo '文件目录名:'.$path_parts['dirname']."<br />";
echo '文件全名:'.$path_parts['basename']."<br />";
echo '文件扩展名:'.$path_parts['extension']."<br />";
echo '不包含扩展的文件名:'.$path_parts['filename']."<br />";
?>

4、 PHP实现文件留言本

我们来看一下文件结构:

index.php ---展示输入框和留言内容

write.php ---向message.txt写入数据

message.txt ---存入聊天内容

index.php文件

<?Php
//设置时区
date_default_timezone_set('PRC');
//读了内容
@$string = file_get_contents('message.txt');
//如果$string 不为空的时候执行,也就是message.txt中有留言数据
if (!empty($string)) {
//每一段留言有一个分格符,但是最后多出了一个&^。因此,我们要将&^删掉
$string = rtrim($string, '&^');
//以&^切成数组
$arr = explode('&^', $string);
//将留言内容读取
foreach ($arr as $value) {
//将用户名和内容分开
list($username, $content, $time) = explode('$#', $value);
echo '用户名为<font color="gree">' . $username . '</font>内容为<font color="red">' . $content . '</font>时间为' . date('Y-m-d H:i:s', $time);
echo '<hr />';
}
}
?>
<h1>基于文件的留言本演示</h1>
<form action="write.php" method="post">
用户名:<input type="text" name="username" /><br />
留言内容:<textarea name="content"></textarea><br />
<input type="submit" value="提交" />
</form>

看了刚刚的展示内容,我们知道文件存储时:

1.段与段之间进行了分割

2.内容与用户之前用一个特殊的符号进行了分割

下面我们来写write.php写入留言至文件的代码:

<?php
//追加方式打开文件
$fp=fopen('message.txt','a'); //设置时间
$time=time(); //得到用户名
$username=trim($_POST['username']);
//得到内容
$content=trim($_POST['content']); //组合写入的字符串:内容和用户之间分开,使用$#
//行与行之间分开,使用&^
$string=$username.'$#'.$content.'$#'.$time.'&^'; //写入文件
fwrite($fp,$string); //关闭文件
fclose($fp); header('location:index.php'); ?>

5、PHP文件上传

在我们日常使用中经常会遇到很多种这样的情况:

QQ空间里面上传图片呀

微信朋友圈上传图片

发邮件里面上传邮件资料附件

认证的时候要求上传照片或身份证

文件上传需要注意php.ini文件

配置项 功能说明
file_uploads on为 开启文件上传功能,off为关闭
post_max_size 系统允许的POST传参的最大值
upload_max_filesize 系统允许的上传文件的最大值
memory_limit 内存使用限制

建议尺寸: file_size(文件大小) < upload_max_filesize < post_max_size < memory_limit

另外,需要注意的是脚本执行时间。

max_execution_time,这什参数的单位为秒。

这个参数是设定脚本的最大执行时间。

也可以根据需求做适当的改变。通常不需要来修改,系统默认值即可。超大文件上传的时候,可能会涉及到这一项参数的修改。

上传时间太长了,会超时。如果你将此项参数设为0,则是不限制超时时间,不建议使。

完成了php.ini的相关配置,我们就可以开始试着完成第一次文件上传了。

1. php文件上传的步骤

系统返回的错误码详解

错误码 说明
0 无误,可以继续进行文件上传的后续操作。
1 超出上传文件的最大限制,upload_max_filesize = 2M php.ini中设置,一般默认为2M。可根据项目中的实际需要来修改
2 超出了指定的文件大小,根据项目的业务需求指定上传文件的大小限制
3 只有部分文件被上传
4 文件没有被上传
6 找不到临时文件夹,可能目录不存在或没权限
7 文件写入失败,可能磁盘满了或没有权限

注:错误码中没有5。

2. 自定义判断是否超出文件大小范围

在开发上传功能时。我们作为开发人员,除了php.ini中规定的上传的最大值外。 我们通常还会设定一个值,是业务规定的上传大小限制。

例如:

新浪微博或者QQ空间只准单张头像图片2M。而在上传图册的时候又可以超过2M来上传。

所以说,它的系统是支持更大文件上传的。

此处的判断文件大小,我们用于限制实际业务中我们想要规定的上传的文件大小。

3. 判断后缀名和mime类型是否符合

在网络世界里面也有坏人。他们会把图片插入病毒,在附件中上传病毒,他们会在网页中插入病毒或者黄色图片。

我们需要对于上传的文件后缀和mime类型都要进行判断才可以。

MIME(Multipurpose Internet Mail Extensions)是多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

在判断后缀和MIME类型的时候,我们会用到PHP的一个函数in_array(),该函数传入两个参数。

第一个参数是要判断的值;

第二个参数是范围数组。

我们用这个函数来判断文件的后缀名和mime类型是否在允许的范围内。

4. 生成文件名

我们的文件上传成功了,不会让它保存原名。因为,有些人在原名中有敏感关键词会违反我国的相关法律和法规。我们可以采用date()、mt_rand()或者unique()生成随机的文件名。

5. 判断是否是上传文件

文件上传成功时,系统会将上传的临时文件上传到系统的临时目录中。产生一个临时文件。同时会产生临时文件名。我们需要做的事情是将临时文件移动到系统的指定目录中。

而移动前不能瞎移动,或者移动错了都是不科学的。移动前我们需要使用相关函数判断上传的文件是不是临时文件。

is_uploaded_file()传入一个参数($_FILES中的缓存文件名),判断传入的名称是不是上传文件。

6. 移动临时文件到指定位置

临时文件是真实的临时文件,我们需要将其移动到我们的网站目录下面了。

让我们网站目录的数据,其他人可以访问到。

我们使用:move_uploaded_file()。

这个函数是将上传文件移动到指定位置,并命名。

传入两个参数:

第一个参数是指定移动的上传文件;

第二个参数是指定的文件夹和名称拼接的字符串。

7. php文件上传表单注意事项

**代码如下:

1.index.html**

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<h1>上传文件</h1>
<form action="chuli.php" method="post" enctype="multipart/form-data">
请选择文件:<input type="file" name="file" /><input type="submit" value="上传" />
</form>
</body>
</html>

注意事项:

1.form 表单中的参数method 必须为post。若为get是无法进行文件上传的

2.enctype须为multipart/form-data

2.chuli.php

<?php
//取文件信息
$arr = $_FILES["file"];
//var_dump($arr);
//加限制条件
//1.文件类型
//2.文件大小
//3.保存的文件名不重复
if(($arr["type"]=="image/jpeg" || $arr["type"]=="image/png" ) && $arr["size"]<10241000 )
{
//临时文件的路径
$arr["tmp_name"];
//上传的文件存放的位置
//避免文件重复:
//1.加时间戳.time()加用户名.$uid或者加.date('YmdHis')
//2.类似网盘,使用文件夹来防止重复
$filename = "./images/".date('YmdHis').$arr["name"];
//保存之前判断该文件是否存在
if(file_exists($filename))
{
echo "该文件已存在";
}
else
{
//中文名的文件出现问题,所以需要转换编码格式
$filename = iconv("UTF-8","gb2312",$filename);
//移动临时文件到上传的文件存放的位置(核心代码)
//括号里:1.临时文件的路径, 2.存放的路径
move_uploaded_file($arr["tmp_name"],$filename);
echo "文件上传成功";
}
}
else
{
echo "上传的文件大小或类型不符";
}
?>

6、 PHP错误处理

在php.ini配置文件中。我们可以控制php的错误显示状态。php.ini中有一个专门的配置项:

display_errors

这个选项设置是否将错误信息输出到网页,或者对用户隐藏而不显示。

这个值的状态为on 或者 off,也可以设值为1 或者0。

display_error的值设为0或者off则不在页面中显示错误,如果设为1或者on则显示错误信息。

问题:如果没有修改服务器php.ini的状态权限怎么办?
可以使用ini_set。
<?php
ini_set('display_errors' , 0 );
?>
上面的代码也相当于修改了php.ini中display_errors的值。不过,仅仅在当前php代码中生效。

问题:想取得php.ini的配置项状态怎么办?

可以使用ini_get(参数项) 得到参数的值。

<?php
echo '服务器中display_errors的状态为' . ini_get('display_errors');
?>

注:修改完php.ini文件,需要重启服务器

1. php错误处理之错误报告级别

【掌握级别的错误类型】 我们将最常用的错误分为了三种:

错误类型 说明
E_ERROR 错误,文件直接中断
E_WARNING 警告,问题比较严重。但是还会继续向下运行
E_NOTICE 提示,有些小问题不会影响到程序。常发生在项目未定义
E_PARSE 编译时语法解析错误。解析错误仅仅由分析器产生。
E_ALL 所有的错误
E_STRICT 启用PHP对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。
E_DEPRECATED 启用后将会对在未来版本中可能无法正常工作的代码给出警告。

在上面的几种类型中:

error最严重,必须要解决。不然程序无法继续向下执行

warning也很重要。通也必须要解决。如果明确的,故意的可以不用处理。

notice 你可以不用管。但是在有些公司,项目标准特别高。在高标准要求的项目中也必须要解决。因为,notice会影响到PHP的执行效率。通常发生在函数未定义等。

parse错误,是指语法错写错了,必须要解决,代表全部类型的所有错误。

1、 在php.ini中error_reporting参数。如若error_reporting参数设置为0。整个PHP引擎发错误均不会显示、输出、记录。在下一章将要讲到的日志记录中,也不会记录。

如果我们想显示所有错误可以写上:

error_reporting = E_ALL

想要显示所有错误但排除提示,可以将这个参数写为:

error_reporting = E_ALL & ~ E_NOTICE

显示所有错误,但排除提示、兼容性和未来兼容性。可写为:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

2、在有些情况下我们无权限操作php.ini文件,又想要控制error_reporting怎么办呢?

在运行的xxxx.php文件中开始处,我们可以使用error_reporting()函数达到目标。

<?php

//关闭了所有的错误显示
error_reporting(0); //显示所有错误
//error_reporting(E_ALL); //显示所有错误,但不显示提示
//error_reporting(E_ALL & ~ E_NOTICE);
?>

2. php错误处理之错误记录日志

在一些公司里面,有专门的日志收集系统。日志收集系统会在背后默默的帮你收集错误、警告、提示。也有些公司没有专门的日志收集系统,通过文件来服务器当中的运行日志。

其中:PHP的错误,警告这些是必须要收信的。那么问题来了——不让用户看到,设置好错误报告级别好,如何将错误收集到日志系统中呢?

这里有需要使用到php.ini的相关配置项。这两个配置项为:

参数 配置项 说明
log_errors on/off 是否开启日志记录
log_errors_max_len 整型,默认1024 单行错误最大记录长度
error_log syslog或者指定路径 错误日志记录在什么地方

说明:

1.在表格中的log_errors和log_errors_max_len非常好理解。

2.而error_log 指定将错误存在什么路径上。配置项中的syslog可能有点不太好理解。syslog是指系统来记录。windows系统在电脑的日志收集器里面。linux默认在: /etc/syslog.conf

[扩展] 了解知识点。若Linux系统启动或修改了日志收集。可能存储在第三方专用的日志收集服务器中。

此外,PHP还为我们专门准备了一个自定义的错误日志函数:

bool error_log ( string $错误消息 [, int $错误消息类型 = 0 [, string $存储目标]] )

这个函数可以把错误信息发送到web服务器的错误日志,或者到一个文件里。

常用的错误消息类型

错误消息类型 说明
0 发送至默认的error_log指定位置
1 发送到指定的邮件位置
3 发送至指定的文件位置
<?php

//无法连接到数据库服务器,直接记录到php.ini 中的error_log指定位置
error_log("无法连接到数据库服务器服务器"); //可以发送邮件,但是php.ini必须配置过邮件系统
error_log('可以用邮件报告错误,让运维人员半夜起床干活',1 ,'pig@php.cn'); //记录在指定的位置
error_log("我是一个错误哟", 3, "d:/test/my-errors.log"); ?>

总结

以上就是今天要讲的内容,本文仅仅简单对之前PHP知识的一些补充,后面可能会用到。

PHP文件上传、错误处理的更多相关文章

  1. php文件上传错误信息说明对照表

    php文件上传错误信息说明对照表: UPLOAD_ERR_OK:其值为0,没有错误发生,文件上传成功UPLOAD_ERR_INI_SIZE:其值为1,上传的文件超过了php.ini中upload_ma ...

  2. PHP文件上传错误类型及说明

    从 PHP 4.2.0 开始,PHP 将随文件信息数组一起返回一个对应的错误代码.该代码可以在文件上传时生成的文件数组中的 error 字段中被找到,也就是 $_FILES['userfile'][' ...

  3. strut2 自己定义文件上传错误信息

    在文件上传过程中我们能够指定拦截器对文件类型.后缀名.大小进行设定,action中的配置: <interceptor-ref name="fileUpload"> &l ...

  4. php文件上传错误信息

    错误信息说明 UPLOAD_ERR_OK:其值为0,没有错误发生,文件上传成功 UPLOAD_ERR_INI_SIZE:其值为1,上传的文件超过了php.ini和upload_max_filesize ...

  5. php文件上传接口及文件上传错误服务器配置

    一:上传表单 <form enctype="multipart/form-data" action="doFileUp.php" method=" ...

  6. strut2 自定义文件上传错误信息

    在文件上传过程中我们可以指定拦截器对文件类型.后缀名.大小进行设定,action中的配置: <interceptor-ref name="fileUpload"> &l ...

  7. php 文件上传错误

    假设文件上传字段的名称img,则: $_FILES['img']['error']有以下几种类型 1.UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功. 2.UPLOAD_ERR_I ...

  8. spring MVC 文件上传错误

    1.The request sent by the client was syntactically incorrect () http://luanxiyuan.iteye.com/blog/187 ...

  9. IE浏览器 AjaxForm文件上传错误:Stream ended unexpectedly

    错误日志: 1 org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet requ ...

  10. input file美化,文件上传

    此文学习至:http://www.haorooms.com/post/input_file_leixing 然而只会用,不会做,UI泪茫茫 效果图: 原图: 美化后: 此主要用css美化表单,然后用J ...

随机推荐

  1. Elasticsearch 国内镜像下载站

    镜像地址:https://thans.cn/mirror/elasticsearch.html 支持 5.0.0~7.3.1 各个平台的各个版本. 本文章转载他人.

  2. 灵活运用的@RequestParam和@RequestBody

    最近在编写项目的过程中,老出现前后端传递参数格式不一致.不统一的问题,对于一个已经快工作一年的Java程序员来说,实属不合格,所以我就下来好好研究了一下@RequestParam和@RequestBo ...

  3. 分布式监控系统之Zabbix网络发现

    前文我们了解了zabbix的宏,自定义item和模板的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14013331.html:今天我们来了解下zab ...

  4. elasticsearch集群安装+安全验证+kibana安装

    准备环境 启动4个centos容器, 并暴露相对应端口 (我的本机ip为172.16.1.236,以下涉及到的地方需要修改为自己的ip) node_name ip http port transpor ...

  5. PHP 使用gd库给图片加图片水印,文字水印,并返回路径

    //图片水印 $mark_filename = './02.jpg'; //获取图片信息 $info = getimagesize($mark_filename); //获取图片的后缀 $type = ...

  6. ctf-web-sql

    姿势文章总结 freebuf http://www.freebuf.com/news/139288.html http://www.freebuf.com/articles/web/137094.ht ...

  7. Pinpoint 更改agentid 和 agent name 长度限制(Pinpoint系列二)

    本文基于 Pinpoint 2.1.0 版本 本文的内容为了更改 ID 和 Name 长度限制,因为有使用容器或者是服务名称确实比较长,所以根据业务场景,我们需要更改源码来实现这个. 具体更改,参考 ...

  8. 如何将各种音频视频素材导入Vegas?

    使用vegas制作视频时,我们经常需要将音频和视频素材导入到媒体库中,以此来达到完美的视听结合效果.其实vegas导入素材并不难,因此很多有剪辑经验的朋友完全可以不用看下去了,主要是纯小白自学视频剪辑 ...

  9. Mac下载器Folx的标签功能怎么使用

    当大家使用Folx下载软件的时候,会发现,下载好的文件或者视频,会被Folx自动打上标签,进行归类,这其实就是Folx自带的智能标签功能,它能智能识别图片.视频.应用程序并分类.但很多时候,智能标签并 ...

  10. 用大白话讲大数据HBase,老刘真的很用心(1)

    老刘今天复习HBase知识发现很多资料都没有把概念说清楚,有很多专业名词一笔带过没有解释.比如这个框架高性能.高可用,那什么是高性能高可用?怎么实现的高性能高可用?没说! 如果面试官听了你说的,会有什 ...