PHP_011 文件和目录
博客专区 > g00m 的博客 > 博客详情
PHP_011 文件和目录
g00m 发表于3年前
PHP_011 文件和目录
  • 发表于 3年前
  • 阅读 15
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

文件包含

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() 返回指定目录中的文件和目录的数组。

 

共有 人打赏支持
粉丝 6
博文 42
码字总数 37146
评论 (0)
×
g00m
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: