文档章节

PHP_011 文件和目录

g00m
 g00m
发布于 2015/03/02 21:10
字数 3102
阅读 20
收藏 0

文件包含

include 和 require 语句

在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。

include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。

include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:

  • require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。

  • include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。

因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。

包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。

语法

include 'filename';

或者

require 'filename';

实例1

假设您有一个标准的页头文件,名为 "header.php"。如需在页面中引用这个页头文件,请使用 include/require:

<html>
<body>
<?php include 'header.php'; ?>
<h1>Welcome to my home page!</h1>
<p>Some text.</p>
</body>
</html>

实例 2

假设我们有一个在所有页面中使用的标准菜单文件。

"menu.php":

echo '<a href="/default.php">Home</a>
<a href="/tutorials.php">Tutorials</a>
<a href="/references.php">References</a>
<a href="/examples.php">Examples</a> 
<a href="/about.php">About Us</a> 
<a href="/contact.php">Contact Us</a>';

网站中的所有页面均应引用该菜单文件。以下是具体的做法:

<html>
<body>
<div class="leftmenu">
<?php include 'menu.php'; ?>
</div>
<h1>Welcome to my home page.</h1>
<p>Some text.</p>
</body>
</html>

实例 3

假设我们有一个定义变量的包含文件("vars.php"):

<?php
$color='red';
$car='BMW';
?>

这些变量可用在调用文件中:

<html>
<body>
<h1>Welcome to my home page.</h1>
<?php include 'vars.php';
echo "I have a $color $car"; // I have a red BMW
?>
</body>
</html>

打开文件

fopen() 函数用于在 PHP 中打开文件。

此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:

<html>
<body>
<?php

$file=fopen("welcome.txt","r");

?>
</body>
</html>

文件可能通过下列模式来打开:

模式 描述
r 只读。在文件的开头开始。
r+ 读/写。在文件的开头开始。
w 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。
w+ 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。
a 追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。
a+ 读/追加。通过向文件末尾写内容,来保持文件内容。
x 只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
x+ 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。

注释:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。

实例

如果 fopen() 函数不能打开指定的文件,下面的实例会生成一段消息:

<html>
<body>
<?php

$file=fopen("welcome.txt","r") or exit("Unable to open file!");

?>
</body>
</html>

关闭文件

fclose() 函数用于关闭打开的文件:

<?php

$file = fopen("test.txt","r");
//some code to be executed

fclose($file);
?>

检测 End-of-file

feof() 函数检测是否已到达文件末尾(EOF)。

在循环遍历未知长度的数据时,feof() 函数很有用。

注释:在 w 、a 和 x 模式下,您无法读取打开的文件!

if (feof($file)) echo "End of file";

逐行读取文件

fgets() 函数用于从文件中逐行读取文件。

注释:在调用该函数之后,文件指针会移动到下一行。

实例

下面的实例逐行读取文件,直到文件末尾为止:

<?php

   
$file = fopen("welcome.txt", "r") or exit("Unable to open file!");   


//Output a line of the file until the end is reached

   

while(!feof($file))
{

echo fgets($file). "<br>";

}
fclose($file);
?>

逐字符读取文件

fgetc() 函数用于从文件中逐字符地读取文件。

注释:在调用该函数之后,文件指针会移动到下一个字符。

实例

下面的实例逐字符地读取文件,直到文件末尾为止:

<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
while (!feof($file))
{

echo fgetc($file);

}
fclose($file);
?>

文件上传表单

允许用户从表单上传文件是非常有用的。

请看下面这个供上传文件的 HTML 表单:

<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>

有关上面的 HTML 表单的一些注意项列举如下:

  • <form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。

  • <input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。

注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。

上传脚本

"upload_file.php" 文件含有供上传文件的代码:

<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{

echo "Upload: " . $_FILES["file"]["name"] . "<br>";

echo "Type: " . $_FILES["file"]["type"] . "<br>";

echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";

echo "Stored in: " . $_FILES["file"]["tmp_name"];

}
?>

通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。

第一个参数是表单的 input name,第二个下标可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。如下所示:

  • $_FILES["file"]["name"] - 被上传文件的名称

  • $_FILES["file"]["type"] - 被上传文件的类型

  • $_FILES["file"]["size"] - 被上传文件的大小,以字节计

  • $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称

  • $_FILES["file"]["error"] - 由文件上传导致的错误代码

这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关允许哪些用户上传文件的限制。

上传限制

在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 和 .jpeg 文件,文件大小必须小于 20 kB:

<?php

$allowedExts = array("gif", "jpeg", "jpg", "png");

$temp = explode(".", $_FILES["file"]["name"]);

$extension = end($temp);

if ((($_FILES["file"]["type"] == "image/gif")

|| ($_FILES["file"]["type"] == "image/jpeg")

|| ($_FILES["file"]["type"] == "image/jpg")

|| ($_FILES["file"]["type"] == "image/pjpeg")

|| ($_FILES["file"]["type"] == "image/x-png")

|| ($_FILES["file"]["type"] == "image/png"))

&& ($_FILES["file"]["size"] < 20000)

&& in_array($extension, $allowedExts))

{

if ($_FILES["file"]["error"] > 0)

{

echo "Error: " . $_FILES["file"]["error"] . "<br>";

}

else

{

echo "Upload: " . $_FILES["file"]["name"] . "<br>";

echo "Type: " . $_FILES["file"]["type"] . "<br>";

echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";

echo "Stored in: " . $_FILES["file"]["tmp_name"];

}

}

else

{

echo "Invalid file";

}

?>

保存上传的文件

上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。

这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:

<?php

$allowedExts = array("gif", "jpeg", "jpg", "png");

$temp = explode(".", $_FILES["file"]["name"]);

$extension = end($temp);

if ((($_FILES["file"]["type"] == "image/gif")

|| ($_FILES["file"]["type"] == "image/jpeg")

|| ($_FILES["file"]["type"] == "image/jpg")

|| ($_FILES["file"]["type"] == "image/pjpeg")

|| ($_FILES["file"]["type"] == "image/x-png")

|| ($_FILES["file"]["type"] == "image/png"))

&& ($_FILES["file"]["size"] < 20000)

&& in_array($extension, $allowedExts))

{

if ($_FILES["file"]["error"] > 0)

{

echo "Return Code: " . $_FILES["file"]["error"] . "<br>";

}

else

{

echo "Upload: " . $_FILES["file"]["name"] . "<br>";

echo "Type: " . $_FILES["file"]["type"] . "<br>";

echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";

echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";


if (file_exists("upload/" . $_FILES["file"]["name"]))

{

echo $_FILES["file"]["name"] . " already exists. ";

}

else

{

move_uploaded_file($_FILES["file"]["tmp_name"],

"upload/" . $_FILES["file"]["name"]);

echo "Stored in: " . "upload/" . $_FILES["file"]["name"];

}

}

}

else

{

echo "Invalid file";

}

?>

上面的脚本检测了文件是否已存在,如果不存在,则把文件拷贝到名为 "upload" 的文件夹。


Filesystem函数

Runtime 配置

Filesystem 函数的行为受到 php.ini 中设置的影响。

Filesystem 配置选项:

名称 默认 描述 可改变
allow_url_fopen "1" 允许 fopen()-type 函数使用 URL。(PHP 4.0.4 版以后可用) PHP_INI_SYSTEM
user_agent NULL 定义 PHP 发送的用户代理。(PHP 4.3 版以后可用) PHP_INI_ALL
default_socket_timeout "60" 设置基于 socket 流的默认的超时时间(秒)。(PHP 4.3 版以后可用) PHP_INI_ALL
from "" 定义匿名 FTP 的密码(您的 email 地址)。 PHP_INI_ALL
auto_detect_line_endings "0" 当设置为 "1" 时,PHP 将检查通过 fgets() 和 file() 取得的数据中的行结束符号是符合 Unix、MS-Dos 还是 Mac 的习惯。(PHP 4.3 版以后可用) PHP_INI_ALL

PHP 5 Filesystem 函数

函数 描述
basename() 返回路径中的文件名部分。
chgrp() 改变文件组。
chmod() 改变文件模式。
chown() 改变文件所有者。
clearstatcache() 清除文件状态缓存。
copy() 复制文件。
delete() 参见 unlink() 或 unset()
dirname() 返回路径中的目录名称部分。
disk_free_space() 返回目录的可用空间。
disk_total_space() 返回一个目录的磁盘总容量。
diskfreespace() disk_free_space() 的别名。
fclose() 关闭打开的文件。
feof() 测试文件指针是否到了文件末尾。
fflush() 向打开的文件刷新缓冲输出。
fgetc() 从打开的文件中返回字符。
fgetcsv() 从打开的文件中解析一行,校验 CSV 字段。
fgets() 从打开的文件中返回一行。
fgetss() 从打开的文件中返回一行,并过滤掉 HTML 和 PHP 标签。
file() 把文件读入一个数组中。
file_exists() 检查文件或目录是否存在。
file_get_contents() 把文件读入字符串。
file_put_contents() 把字符串写入文件。
fileatime() 返回文件的上次访问时间。
filectime() 返回文件的上次修改时间。
filegroup() 返回文件的组 ID。
fileinode() 返回文件的 inode 编号。
filemtime() 返回文件内容的上次修改时间。
fileowner() 返回文件的用户 ID (所有者)。
fileperms() 返回文件的权限。
filesize() 返回文件大小。
filetype() 返回文件类型。
flock() 锁定或释放文件。
fnmatch() 根据指定的模式来匹配文件名或字符串。
fopen() 打开一个文件或 URL。
fpassthru() 从打开的文件中读数据,直到文件末尾(EOF),并向输出缓冲写结果。
fputcsv() 把行格式化为 CSV 并写入一个打开的文件中。
fputs() fwrite() 的别名。
fread() 读取打开的文件。
fscanf() 根据指定的格式对输入进行解析。
fseek() 在打开的文件中定位。
fstat() 返回关于一个打开的文件的信息。
ftell() 返回在打开文件中的当前位置。
ftruncate() 把打开文件截断到指定的长度。
fwrite() 写入打开的文件。
glob() 返回一个包含匹配指定模式的文件名/目录的数组。
is_dir() 判断文件是否是一个目录。
is_executable() 判断文件是否可执行。
is_file() 判断文件是否是常规的文件。
is_link() 判断文件是否是连接。
is_readable() 判断文件是否可读。
is_uploaded_file() 判断文件是否是通过 HTTP POST 上传的。
is_writable() 判断文件是否可写。
is_writeable() is_writable() 的别名。
lchgrp() 改变符号连接的组所有权。
lchown() 改变符号连接的用户所有权。
link() 创建一个硬连接。
linkinfo() 返回有关一个硬连接的信息。
lstat() 返回关于文件或符号连接的信息。
mkdir() 创建目录。
move_uploaded_file() 把上传的文件移动到新位置。
parse_ini_file() 解析一个配置文件。
parse_ini_string() 解析一个配置字符串。
pathinfo() 返回关于文件路径的信息。
pclose() 关闭由 popen() 打开的进程。
popen() 打开一个进程。
readfile() 读取一个文件,并写入到输出缓冲。
readlink() 返回符号连接的目标。
realpath() 返回绝对路径名。
realpath_cache_get() 返回高速缓存条目。
realpath_cache_size() 返回高速缓存大小。
rename() 重命名文件或目录。
rewind() 倒回文件指针的位置。
rmdir() 删除空的目录。
set_file_buffer() 设置已打开文件的缓冲大小。
stat() 返回关于文件的信息。
symlink() 创建符号连接。
tempnam() 创建唯一的临时文件。
tmpfile() 创建唯一的临时文件。
touch() 设置文件的访问和修改时间。
umask() 改变文件的文件权限。
unlink() 删除文件。

Directory 函数

函数 描述
chdir() 改变当前的目录。
chroot() 改变根目录。
closedir() 关闭目录句柄。
dir() 返回 Directory 类的实例。
getcwd() 返回当前工作目录。
opendir() 打开目录句柄。
readdir() 返回目录句柄中的条目。
rewinddir() 重置目录句柄。
scandir() 返回指定目录中的文件和目录的数组。

 

本文转载自:

共有 人打赏支持
g00m
粉丝 5
博文 51
码字总数 37146
作品 0
广州
linux 命令篇 -- 新建用户

useradd -g whh -d /software/whh whh 创建用户whh,加入whh组,家目录在/software/whh下面 useradd -s /sbin/nologin -M wxh 创建无法登陆系统的且没有家目录的用户wxh useradd -g adm -d /...

王子不语
06/26
0
0
1.6 Apache2.4与php结合

1.6 Apache2.4与php结合 httpd主配置文件/usr/local/apache2.4/conf/httpd.conf vim /usr/local/apache2.4/conf/httpd.conf //修改以下4个地方 ServerName Require all denied AddType appl......

脑洞老湿_
02/22
0
0
用HEADER实现下载问题,下载下来的文件不能打开,显示文件损坏

写了两个页面,file.php和filedown.php两个页面,这两个页面代码完全一直,编码都是用的utf-8,但是file.php下载下来的文件正常的,filedown.php下载下来的文件就不能打开了,说是文件损坏,...

Scchary
2013/12/31
678
0
mac os安装java web开发环境配置

1.jdk安装 jdk需要安装1.7或者更高版本,jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 安装后在终端输入:java -version 检测是否安装成功,如果不成功...

上官胡闹
2016/08/26
23
0
php文件下载的问题,下载之后文件打不开,求回答

@南湖船老大 你好,想跟你请教个问题: 问您个问题啊。。 php下载文件的问题,代码如下:感觉也没什么问题啊,文件也可以正常下载下来,但是下载下来之后,文件不能打开,说是“文件可能已经...

Scchary
2013/12/29
680
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

获取多个集合列表的笛卡尔积

获取多个集合笛卡尔积 电商中典型业务场景:商品搜索 单属性属性值之间为并查询 不同属性的属性值之间查询为与查询 import java.util.ArrayList;import java.util.List;/** * Created w...

键走偏锋
14分钟前
0
0
echarts 迁移地图 控制鼠标缩放大小比例

在网上找了好久没有找到解决方式,还是重新看了一下文档,终于找到的解决方案, zoom:1, //默认显示级别 scaleLimit:{min:1,max:3}, // 缩放级别 echarts 文档-配置项链接 http://echarts.b...

心驰
18分钟前
0
0
Boot2Docker ISO is out-of-date,

Boot2Docker ISO is out-of-date, downloading the latest release. 使用docker-machine时无法更新Boot2Docker ISO导致创建vm machine失败 解决方法:关闭网络,创建好之后再开启...

writeademo
26分钟前
0
0
在 Tomcat 中设置 Tapestry 框架的 html 热加载

如果开发中使用到了 Tapestry 这个框架,如果事先没有设置过的话,开发的时候 html 是不会热加载的,也就是说修改了 html 文件,不能刷新浏览器后立马看到修改完的效果,必须先重新启动应用服...

LeoXu
48分钟前
0
0
【微服务】开启巨石应用到微服务的探索

背景 在过去的一年时间里,我一直在从事一件事情,将现有的单体应用(巨石应用)向微服务改造。 接下来,将持续整理一些在微服务路上的学习与成长。 为什么要做微服务 单体应用,开发、部署简...

艳沐石
58分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部