-
PHP的高级应用(5)——文件存取
普通类 -
- 支持
- 批判
- 提问
- 解释
- 补充
- 删除
-
-
默认段落标题(请修改)...
第三部分:PHP的高级应用
PHP中可以直接使用文件存取函数进行文件的读取、存储访问等。此外还可以通过网页表单进行文件上传等操作。下面我们首先来学习fopen()函数。fopen() 函数用于在 PHP 中打开文件,当我们在程序中进行文件的操作中,第一步就是建立文件变量,打开文件,这样才能开始正常的对对应文件进行读取或者存储。fopen函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:
<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);
?>
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>
<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
if (((\$_FILES["file"]["type"] == "image/gif")
|| (\$_FILES["file"]["type"] == "image/jpeg")
|| (\$_FILES["file"]["type"] == "image/pjpeg"))
&& (\$_FILES["file"]["size"] < 20000))
{
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";
}
?>
注释:对于 IE,识别 jpg 文件的类型必须是 pjpeg,对于 FireFox,必须是 jpeg。
上面的例子在服务器的 PHP 临时文件夹创建了一个被上传文件的临时副本。
这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
<?php
if (((\$_FILES["file"]["type"] == "image/gif")
|| (\$_FILES["file"]["type"] == "image/jpeg")
|| (\$_FILES["file"]["type"] == "image/pjpeg"))
&& (\$_FILES["file"]["size"] < 20000))
{
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" 的新文件夹。
-
-
- 标签:
- 打开
- fopen
- 文件
- echo
- type
- file
- 存取
- php
- files
- 函数
- 高级
- 应用
- 上传
-
学习元评论 (0条)
聪明如你,不妨在这 发表你的看法与心得 ~