1. php对文件的基本操作
1.1 概要
在程序运行时,程序本身和数据一般都存在内存中,当程序运行结束后,存放在内存中的数据被释放。如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须以文件形式存储到外部存储介质上。文件一般指存储在外部介质上具有名字(文件名)的一组相关数据集合。用文件可长期保存数据,并实现数据共享。PHP是以UNIX的文件系统为模型的。因此在Windows系统中我们只能获得”file”、”dir”或者“unknown”三种文件类型。而在UNIX系统中,我们可以获得block、char、dir、fifo、file、link和unknown七种类型。可以使用函数filetype()获取文件的具体类型。语法:string filetype ( string filename )
1.2 Linux 七种文件格式说明
block 块设备文件,如某个磁盘分区,软驱,光驱CD-ROM
块设备文件,如某个磁盘分区,软驱,光驱CD-ROM
char
字符设备是指在I/O传输过程中以字符为单位进行传输的设备,如键盘、打印机等
dir
目录类型,目录也是文件的一种
fifo
命名管道,常用于将信息从一个进程传递到另一个进程
file
普通文件类型,如文本文件或可执行文件等
link
符号链接,是指向文件指针的指针。类似Windows中的快捷方式
unknown 顾名思义
顾名思义
1.3 几个简单的判断函数
0x00:
is_dir( ) – 判断给定文件名是否是一个目录语法结构:bool
is_dir(名称)返回类型:文件名存在并且是一个目录则返回 true,否则返回
falseis_executable( ) – 判断给定文件名是否可执行语法结构:
bool is_executable(名称)返回类型:如果文件存在且可执行则返回 true ,否则返回 false 。is_file( ) – 判断给定文件名是否为一个正常的文件语法结构:
bool is_file(名称)返回类型:如果文件存在且为正常的文件则返回 true 。
is_link( ) – 判断给定文件名是否为一个符号连接语法结构:
bool is_link(名称)返回类型:如果文件存在并且是一个符号连接则返回 true。
is_readable( ) – 判断给定文件名是否可读语法结构:
bool is_readable(文件名称)返回类型:如果文件存在并且可读则返回 true 。
is_writable( ) – 判断给定的文件名是否可写语法结构:
bool is_writable(文件名称)返回类型:如果文件存在并且可写则返回 true 。
0x01
- file_exists( )
检查文件或目录是否存在
- filesize()
取得文件大小
- is_readable()
判断文件是否可读
is_writable()
判断文件是否可写
- is_executable()
判断文件是否可执行
- filectime()
获取文件的创建时间
- filemtime()
获取文件的修改时间
- stat()
获取文件大部分属性
fp:
//filetype("1.jpg");//当前路径用./或者不写;上一级用../;
//echo filetype("./1.jpg"); //判断./1.jpg是什么 ,返回file,是文件
//echo filetype("./touxiang"); //判断./code是什么,返回dir是文件夹
//echo is_dir("touxiang"); //判断code是不是目录文件夹,是返回1
//echo is_file("1.jpg"); //判断1.jpg是不是文件,是返回1
//date('Y-m-d H:i:s',time());//显示当前日期时间
//date_default_timezone_set('PRC'); //如果时间不对,可能是时区不对,需要加上这个改为东八区区时
//echo date("Y-m-d H:i:s",fileatime("1.jpg")); //获取上次的访问时间
//echo date("Y-m-d H:i:s",filectime("1.jpg"));//获取文件的创建时间
//echo date("Y-m-d H:i:s",filemtime("1.jpg"));//获取文件的修改时间
//echo filesize("1.jpg");//获取文件大小(字节),如果想转换成KB需要在后面“/1024”
//echo file_exists("1.jpg");//判断1.jpg是否存在,存在返回1
//filetype("1.jpg");//当前路径用./或者不写
//echo filetype("/wamp");//在php单纯“/”代表磁盘的根目录,如D盘
//echo "<img src='/weixin/1.jpg' />";//如果是网页页面中的“/”则代表服务器的根目录
//echo $_SERVER['DOCUMENT_ROOT'];//找网站的根目录
//echo basename("./touxiang/7.jpg",".jpg");//从路径中返回文件名+扩展名,如果第二个参数写上文件扩展名,则只返回文件名
//echo dirname("./contact/3.jpg");//从路径中返回目录名,输出(./contact)
//print_r(pathinfo("./weixin/touxiang/2.jpg"));//返回路径所有信息,返回类型是数组,输出(Array ( [dirname] => ./weixin/touxiang [basename] => 2.jpg [extension] => jpg [filename] => 2 ) )
//echo realpath("1.jpg");//将相对路径转换为绝对路径,输出(D:\wamp\www\weixin\1.jpg )
//mkdir("./touxiang/suiji");//创建文件夹(目录):在touxiang文件下创建suiji文件夹
//rmdir("./touxiang/suiji");//删除文件夹(目录):删除touxiang文件夹下的suiji文件夹,只能删除空文件夹
//rename("./touxiang/name","./suiji");//移动或重命名:将touxiang目录下的name文件夹重命名为suiji并移动到当前目录下
//print_r(glob("./*"));//获取该目录下所有文件或查找该目录下某一文件:Array ( [0] => ./1.jpg [1] => ./chuantouxiang.php [2] => ./denglu.php [3] => ./jquery-1.11.2.min.js [4] => ./mydbda.php [5] => ./sanjichuli.php [6] => ./suiji [7] => ./touxiang [8] => ./zhuce.php [9] => ./zhucechuli.php )
/*$dir = opendir("./touxiang");//打开目录资源:
//echo readdir($dir);
//echo readdir($dir);
//echo readdir($dir);
//echo readdir($dir);
//echo readdir($dir);//...1.jpg10.jpg11.jpg
while($filename = readdir($dir))
{
echo $filename."<br>";//读取该"./touxiang"目录下所有文件,每读一条,指针向下走一个,注意:第一个.是前面目录,第二个是..上一级目录。
}
echo"******************************";
rewinddir($dir);//返回指针
while($filename = readdir($dir))
{
echo $filename."<br>";//读取该"./touxiang"目录下所有文件
}
closedir($dir);//关闭目录资源:*/
1.4 文件的基本操作
1.4.1 常见的路径
$LunixPath="/var/www/html/index.php";
$winPath=“C:\Appserv\www\index.php”;
$winPath2=“C:/Appserv/www/index.php”;
操作函数:
basename – 返回路径中的文件名部分
dirname – 返回路径中的目录部分
fp:
$path = "/home/httpd/html/index.php";
$file = basename($path); // $file值:"index.php"$file = basename($path, ".php"); // $file值:"
index "$file = dirname($path); // $file值:"/home/httpd/html"
1.4.2 遍历目录实例
$num=0; //用来统计子目录和文件的个数
$dirname='phpMyAdmin'; //定义一个目录名
$dir_handle=opendir($dirname); //用opendir打开目录
//将遍历的目录和文件名使用表格格式输出
while($file=readdir($dir_handle)) { //使用readdir循环读取目录里的内容
$dirFile=$dirname."/".$file; //追加目录名
echo "文件名: ".$file." | "; //显示文件名
echo "大小: ".filesize($dirFile)." | "; //显示文件大小
echo "类型: ".filetype($dirFile)." | "; //显示文件类型
echo "创建时间: ".date("Y/n/t",filectime($dirFile))."<br/>";
$num++;
}
closedir($dir_handle); //关闭文件操作句柄
echo ‘在<b>’.$dirname.‘</b>目录下共有文件<b>'.$num.'</b>个';
1.4.3 文件的打开与关闭
fopen – 打开文件或者 URL
语法:resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )
filename参数需要提供要被打开文件的URL。这个URL可以是脚本所在的服务器中的绝对路径,也可以是相对路径,还可以是网络资源用的文件。
mode 参数指定了所要求到该流的访问类型,(强烈建议附加b模式)。
如果也需要在 include_path中搜寻文件的话,可以将可选的第三个参数 use_include_path 设为 ‘1’ 或 TRUE。
如果打开失败,本函数返回 FALSE。
fclose – 关闭一个已打开的文件指针
语法:bool fclose ( resource $handle )
将 handle 指向的文件关闭。 成功时返回 TRUE, 或者在失败时返回 FALSE.
fp:
$handle = fopen("/home/rasmus/file.txt", "r");
//访问文档根目录下的文件,也以只读模式打开
$handle = fopen(“{$_SERVER['DOCUMENT_ROOT']}/data/info.txt", "r");
//在 Windows 平台上,转义文件路径中的每个反斜线,或者用斜线,
以二进制和只写模式组合
$handle = fopen("c:\\data\\file.gif", "wb");
//使用相对路径打开file.txt文件,选择只读模式,并返回资源$handle
$handle = fopen("../data/info.txt", "r");
//打开远程文件, 使用HTTP协议只能以只读的模式打开
$handle = fopen("http://www.example.com/", "r");
//使用FTP协议打开远程文件,如果FTP服务器可写,则可以以写的模式打开
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
1.4.4 fwrite -- 写入文件(可安全用于二进制文件)
语法:int fwrite ( resource handle, string string [, int length] )fwrite() 把 string 的内容写入 文件指针 handle 处。 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。返回写入的字符数,出现错误时则返回 FALSE 。
fp:
$file = fopen("test.txt","w");
echo fwrite($file,"Hello World. Testing!");
fclose($file);
running
1.4.1 读取文件内容
//从文件中读取指定字节数的内容存入到一个变量中
$filename = "data.txt"; //将本地文件名保存在变量中
$handle = fopen($filename, "r") or die("文件打开失败"); //以只读的方式打开文件
$contents = fread($handle, 100); //读取前100个字节;全部:filesize($filename)
fclose($handle); //关闭文件资源
echo $contents; //将从文件中读取的内容输出
//从文件中读取全部内容存入到一个变量中,每次读取一部分,循环读取
$filename = "c:\\files\\somepic.gif";//二进制文件的文件
$handle = fopen ($filename, "rb") or die("文件打开失败");
//以只读的方式,模式加了’b’
$contents = "";
while (!feof($handle)) { //使用feof()判断文件结尾
$contents .= fread($handle, 1024); //每次读取1024个字节
}
fclose($handle); //关闭文件资源
echo $contents; //将从文件中读取的全部内容输出
fp2:
$filename = "D:\phpStudy\WWW\something.txt";
$handle = fopen($filename, "r");//读取二进制文件时,需要将第二个参数设置成'rb'
//通过filesize获得文件大小,将整个文件一下子读到一个字符串中
$contents = fread($handle, filesize ($filename));
fclose($handle);
1.4.5访问远程文件
如果需要访问远程文件,必须在PHP的配置文件中激活“allow_url_fopen”选项,才能使用fopen( )函数打开运程文件。而且还要确定其他服务器中的文件是否访问权限,如果使用PHP协议对远程文件进行链接,只能以“只读”模式打开。如果需要访问的远程FTP服务器中,对所提供的用户开启了“可写”权限,则使用FTP协议链接远程的文件时,就可以使用“只写”或“只读”模式打开文件。但不可以使用“可读可写”的模式。
使用PHP访问远程文件就像访问本地文件一样,都是使用相同的读写函数处理。
$file=fopen(“http://www.lampbrother.com/”,”r”) or die(“打开远程文件失败!!”);
$file=fopen(“ftp://user:password@ftp.lampbrother.net/path/to/file”,”w”);
fp:
$file = fopen ("http://www.baidu.com/rebot.txt", "r") or die("打开远程文件失败!!");
while (!feof ($file)) { //循环从文件中读取内容
$line = fgets ($file, 1024); //每读取一行
//如果找到远程文件中的标题标记则取出标题,并退出循环,不在读取文件
if (preg_match("/<title>(.*)<\/title>/", $line, $out)) { //使用正则匹配标题标记
$title = $out[1]; //将标题标记中的标题字符取出
break; //退出循环,结束远程文件读取
}
}
fclose($file); //关闭文件资源
echo $title; //输出获取到的远程网页的标题
1.5 文件上传
这是老朋友了,先来个html表单压压惊
<html>
<head><title>文件上传</title></head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
选择文件:<input type="file" name="myfile">
<input type="submit" value="上传文件">
</form>
</body>
</html>
注意事项:
POST方法:
表单最常用的功能,向目标页面传递变量,我们在上传文件的时候,会在表单中设置相应的属性,来完成文件的传递
enctype=“multipart/form-data”
这样服务器就会知道,我们要传递一个文件,这样服务器可以知道上载的文件带有常规的表单信息。
MAX_FILE_SIZE
此字段必须在文件输入字段之前,控制最大的传递文件的大小(字节)
设置浏览器文件输入浏览按钮
fp:
$allowtype = array("gif", "png", "jpg"); //设置充许上传的类型为gif, png和jpg
$size = 1000000; //设置充许大小为1M(1000000字节)以内的文件
$path = "./uploads"; //设置上传后保存文件的路径
//1. 判断文件是否可以成功上传到服务器,$_FILES['myfile']['error'] 为0表示上传成功
if($_FILES['myfile']['error'] > 0) {
echo '上传错误: ';
switch ($_FILES['myfile']['error']) {
case 1: die('上传文件大小超出了PHP配置中的约定值:upload_max_filesize');
case 2: die('上传文件大小超出了表单中的约定值:MAX_FILE_SIZE');
case 3: die('文件只被部分上载');
case 4: die('没有上传任何文件');
case 6: die('找不到临时文件夹');
case 7: die('文件写入失败');
default: die('末知错误');
}
}
//2. 判断上传的文件是否为充许的文件类型,通过文件的后缀名
$hz = array_pop(explode(".", $_FILES['myfile']['name']));
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"];
}
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";
}
1.5.2 文件下载
$filename="./upload/aa.png";
b a s e n a m e = p a t h i n f o ( basename=pathinfo( basename=pathinfo(filename);
header(“Content-Type: image/png”); //指定下载文件类型的
header(“Content-Disposition:attachment;filename=”. b a s e n a m e [ " b a s e n a m e " ] ) ; / / 指 定 下 载 文 件 的 描 述 信 息 h e a d e r ( " C o n t e n t − L e n g t h : " . f i l e s i z e ( basename["basename"]); //指定下载文件的描述信息 header("Content-Length:".filesize( basename["basename"]);//指定下载文件的描述信息header("Content−Length:".filesize(filename)); //指定文件大小的
readfile($filename);//将内容输出,以便下载。