一、PHP文件处理
1.打开文件 fopen()
此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件。
模式 | 描述 |
---|---|
r | 只读。在文件的开头开始。 |
r+ | 读/写。在文件的开头开始。 |
w | 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
w+ | 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
a | 追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。 |
a+ | 读/追加。通过向文件末尾写内容,来保持文件内容。 |
x | 只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
x+ | 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
如果 fopen()
函数无法打开指定文件,则返回 0 (false)。
如果 fopen()
函数不能打开指定的文件,可以用exit()
生成一段消息提示。
<html>
<body>
<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
?>
</body>
</html>
2.关闭文件 fclose()
<?php
$file = fopen("test.txt","r");
//执行一些代码
fclose($file);
?>
3.检测文件末尾(EOF)
feof()
函数检测是否已到达文件末尾(EOF)。
在循环遍历未知长度的数据时,feof() 函数很有用。
在 w 、a 和 x 模式下,无法读取打开的文件!
if (feof($file)) echo "文件结尾";
4.逐行读取文件 fgets()
逐行读取文件,直到文件末尾为止。
在调用该函数之后,文件指针会移动到下一行。
<?php
$file = fopen("welcome.txt", "r") or exit("无法打开文件!");
// 读取文件每一行,直到文件结尾
while(!feof($file))
{
echo fgets($file). "<br>";
}
fclose($file);
?>
5.文件编码
如果打开一个文件名为中文的文件,而系统编码和当前文档编码不一致,会导致文件找不到无法打开,解决方法是用 iconv()
函数编码转换成一致,如下:
$fpath=iconv('UTF-8','GB2312',"题库.csv");
$file=fopen($fpath,"r") or exit("无法打开文件!");
while(!feof($file))
{
echo fgets($file). "<br>";
}
$arr=fgetcsv($file);//这个函数就是读取CSV文件的函数,他把文本读入后转为数组存储在$arr中
fclose($file);
foreach($arr as $key=>$value){echo $value;}//循环输出所有的值
.CSV文件是逗号分隔符。
用相对路径打不开子目录中的文件时,可用绝对路径打开,如下:
$file=fopen(dirname(__FILE__).'\\……(文件夹名)\\1.csv',"r") or exit("无法打开文件!");
二、PHP文件上传
1.文件上传表单
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
<form>
标签的 enctype
属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 “multipart/form-data
”。
<input>
标签的 type="file"
属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
2.文件上传脚本
通过使用 PHP 的全局数组 $_FILES
,可以从客户计算机向远程服务器上传文件。
第一个参数是表单的 input name,第二个下标可以是 “name”、“type”、“size”、“tmp_name” 或 “error”。
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "错误:" . $_FILES["file"]["error"] . "<br>";
//$_FILES["file"]["error"] - 由文件上传导致的错误代码
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
//$_FILES["file"]["name"] - 上传文件的名称
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
// $_FILES["file"]["type"] -上传文件的类型
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
//$_FILES["file"]["size"] - 上传文件的大小,以字节计
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
//$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
}
?>
3.文件上传限制
例子:用户只能上传 .gif、.jpeg、.jpg、.png 文件,文件大小必须小于 200 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"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts)) //if的几个条件
{
if ($_FILES["file"]["error"] > 0)
{
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];//临时副本
}
}
else
{
echo "非法的文件格式";
}
?>
4.保存被上传的文件
上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。
这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$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"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
// 判断当期目录下的 upload 目录是否存在该文件
// 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
}
else
{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "非法的文件格式";
}
?>
上面的脚本检测了文件是否已存在,如果不存在,则把文件拷贝到名为 “upload” 的目录下。
三、文件下载
1.几个文件下载用到的方法:
<?php
//获取文件参数
$filename = $_GET['filename'];
// 修改这一行设置你的文件下载目录
$download_path = "ficheros/";
//不能下载上一层目录的文件
if(eregi("\.\.", $filename)) die("抱歉,你不能下载该文件!");
$file = str_replace("..", "", $filename);
// 包含 .fffffffff 的文件不能下载
if(eregi("\.fffffffff.+", $filename)) die("抱歉,你不能下载该文件!");
// 创建文件下载路径
$file = "$download_path$file";
//判断文件是否存在
if(!file_exists($file)) die("抱歉,文件不存在!");
//文件类型,作为头部发送给浏览器
$type = filetype($file);
// 获取时间和日期
$today = date("F j, Y, g:i a");//格式自定义
$time = time();//当前浏览器时间
//发送文件头部
//告诉浏览器文件类型
header("Content-type: $type");
//告诉浏览器这是一个文件流格式的文件
header( "Content-type: application/octet-stream" );
//请求范围的度量单位
header( "Accept-Ranges: bytes" );
//用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name的值。
header("Content-Disposition: attachment;filename=$filename");
//Content-Length是指定包含于请求或响应中数据的字节长度
header("Accept-Length: ".filesize ($file.$filename ));
//邮件编码——二进制
header("Content-Transfer-Encoding: binary");
//本地缓存 no-store 彻底得禁用缓冲
header('Pragma: no-cache');
//不过期
header('Expires: 0');
// 发送文件内容
set_time_limit(0); //长时间链接运行,不限制运行时间
readfile($file);//若成功,则返回从文件中读入的字节数。若失败,则返回 false。
?>
2. 直接添加文件链接
<button>
<a href = "http://localhost/down.zip">
下载文件
</button>
3.传递参数查找并跳转到下载链接
<button>
<a href = "http://localhost?f='down'">
下载文件
</button>
<?php
$down = $_GET['f']; //获取文件参数
$filename = $down.'.zip'; //获取文件名称
$dir ="down/"; //相对于网站根目录的下载目录路径
$down_host = $_SERVER['HTTP_HOST'].'/'; //当前域名
//判断如果文件存在,则跳转到下载路径
if(file_exists(__DIR__.'/'.$dir.$filename)){
header('location:http://'.$down_host.$dir.$filename);
}else{
header('HTTP/1.1 404 Not Found');
}
?>
4.head() 和 fread()函数把文件直接输出到浏览器(安全)
<?php
$file_name = "down";
$file_name = "down.zip"; //下载文件名
$file_dir = "./down/"; //下载文件存放目录
//检查文件是否存在
if (!file_exists( $file_dir . $file_name )) {
header('HTTP/1.1 404 NOT FOUND');
} else {
//以只读和二进制模式打开文件
$file = fopen( $file_dir . $file_name, "rb" );
header("Content-type: application/octet-stream" );
header("Accept-Ranges: bytes" );
header("Accept-Length: " . filesize ( $file_dir . $file_name ) );
header("Content-Disposition: attachment; filename=" . $file_name );
//读取文件内容并直接输出到浏览器
echo fread( $file, filesize ( $file_dir . $file_name ) );
fclose( $file );
exit();
}