PHP 文件系统详解


Posted in PHP onSeptember 13, 2012

文件处理函数
1.文件操作.

打开文件:

打开指定的文件时会返回相应的对象,若不存在指定的文件,那麽可能会自动创建这个文件。

resource fopen(string filename,string mode [,int use_include_path][,resource context]);

filename 可以是包含文件路径的文件名,也可以是某种协议给出的URL(打开远程文件).为了避免系统切换带来的麻烦,采用'/'作为路径分隔符.

mode: 设置打开文件的方式,分别有:

r:只读模式,文件指针位于文件头部.

r+:只读模式----读/写模式,文件指针位于头部文件.注意可能产生覆盖.

w:只写模式,文件指针位于文件头部.如果文件存在,删除内容重写;否则,自行创建文件.

w+:只写模式----读写文件,读/写文件指针指向文件头部.如果文件存在,删除内容重写;否则,自行创建文件.

x:谨慎写----写模式打开文件,从文件头部开始写如.如果文件存在,返回false,产生一个E_WARNING级别的错误信息

x+:谨慎写---读写模式代开文件.如果文件存在,返回false,产生一个E_WARNING级别的错误信息

a:追加,文件指针指向文件尾部.如果文件存在,则直接在文件尾追加;否则,自行创建文件.

a+:追加,文件指针指向文件尾部.如果文件存在,则直接在文件尾追加或者读取;否则,自行创建文件.

b:二进制模式.用于与其他模式进行链接.(windows 下的选项)

t: 用于与其他模式进行结合.(windows 下的选项)

请慎用fopen()函数,因为一不小心就有可能将文件删除掉.同时,不同的操作系统具有不同的行结束习惯(UNIX:\n Windows:\r\n Macinitosh:\r).如果错误的使用行结束符,那么当打开文件时,可能输出一堆乱码.以上可以通过"'t'","'b'"来避免.
读取文件:

string fgetc(resource handle);//返回从handle指向的文件中的一个字符.如果遇到EOF,则返回false;

string fgets(int handle[,int length]);//从文件指针指向的位置获取一行字符,并且返回最大为length-1个字节的字符串..文件指针必须有效,且指向一个由fopen()或fsockopen()成功打开的文件.length表示读取的数据的长度.在遇到换行,EOF,或者指定length时结束.忽略length将读到行结束.

string fgetss(resource handle[,int length][,string allowable_tags]);//读取一行,且过滤掉html,php标记.

string fread(int handle,int length);//从文件中读取任意长度的数据。,还可以用于读取二进制文件。handle 为指向文件的资源,length 读取length个字节或者遇到EOF时停止执行。
例子:

<?php 
$filename="./files.text"; 
$fp=fopen($finename,"rb"); 
$encho fread($fp,100); 
?>

readfile(),file()和file_get_contents()函数.
readfile(),file()和file_get_contents()函数.

int readfile(string filename[,bool use_include_path,resource context]);//读取一个文件并写入到缓冲区,如果成功,则返回读取的字节数,否则返回false。filename文件名。参数use_include_path控制是否支持在include_path中搜索文件,true为支持。使用readfile函数不需要打开/关闭文件。

array file(string filename [,bool use_include_path[,resource context]]);//将整个文件的内容读取到数组中。如果成功,返回数组,数组中的每个元素都是文件中对应的一行,包活换行符在内;否则返回false;
  string file_get_contents(string filename[,bool use_include_path[,resource context[,int offset[,int maxlen]]]]);//context 为5.0新增的内容,可以用NULL来忽略。offset,maxlen为5.1的的内容。offset 用于标记文件??始的位置,maxlen 设置文件读取的长度。该方法适用于二进制文件的读取。是将文件内容读入到一个字符串的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。如果打开有特殊字符的URL(例如存在空格),那麽要使用urlencode()来进行URL编码。

备注:readfile(),file()和file_get_contents()在读取整个文件夹中的内容时,不需要使用fopen()和fclose()函数,但是在读取一个字符,一行字符和任意长的字符时则必须使用。

2.写入文件:

int fwrite(resource handle,string[,int length]);//执行文件的写入操作,它还有一个别名fputs().该方法用于把string的内容写入文件指针handle处。如果设置length,那麽写入length个字节或者完成string写入后,操作就会停止。成功写入则返回true,否则返回false。
备注:若给出length参数,那麽php.ini文件中的magic_quotes_runtime选项将会被忽略,而string中的斜线将不会被抽去。区分二进制文件和文本文件系统则在打开文件时fopen()函数的mode参数要加上‘b'。

int file_put_contents(string filename,string data[.int flags[,resource context]]);//将一个字符串写入文件中,如果成功则返回字节数,否则返回false。flags:实现对文件的锁定(选项有 file_use_include_path,file_append:追加,lock_ex:独?姿?ǎ??ontext一个context资源。
备注:fwrite()虽然具备写入文件的功能,但是必须有fopen()和fclose()函数的支持。file_put_contents()整合了fopen(),fwrite(),fclose()功能,可以单独完成文件的写入。
3.关闭文件

文件有打开就应该有关闭功能,对文件的操作结束后,应该关闭这个文件,否则可能引起错误。

bool fclose(resouce handle);//将参数handle指向的文件关闭,如果成功则返回true,否则返回false。

锁定文件

在向一个文本文件中写入数据的时候,需要先锁定文件,已防止其他用户同时也修改此文件的内容。php中通过flock()函数实现文件的锁定。

 bool flock(int handle ,int operation);//参数operation控制锁定权限。包括:lock_sh:取得共享锁定(读取程序)。lock_ex:取得独?姿?ǎㄐ慈耄??ock_un:释放锁定。lock_nb:防止flock()函数在锁定时堵塞。

目录处理函数

目录是一种特殊的文件。既然是文件,如果对其进行操作,同样必须先打开,然后才可以进行浏览操作,最后还要记得关闭。

1.打开目录

打开指定的目录文件,若果成功,则返回目录的句柄。否则返回false。与打开文件不同的是,若目录不存在,它并不会自动创建目录,而是抛出一个错误信息。通过在opendir()函数前加“@”符号,可以屏蔽错误信息的输出。

resource opendir(string path[,resource context]);//path指定要打开的目录文件。如果path指定的不是一个有效的目录,或者因为权限问题,文件系统错误不能打开,那麽该函数将会返回false,并且产生一个E_WARNING级别的错误信息。

2.浏览目录

 利用opendir函数返回的句柄配合scandir函数实现浏览操作。

array scandir(string directory[,int sorting_ordering[,resource context]]);//用于浏览指定路径下的目录和文件。如果成功则返回包含文件名的array,否则返回false。directory指定要浏览的目录,如果不是目录,那麽将返回false,并且产生一个E_WARNING级别的错误信息。sorting_order设置排列顺序,默认为字母升序排列。如果带上该参数,则变为降序排列。
备注:is_dir()函数,判断指定文件名是否一个目录。如果文件名存在且为目录,则返回true,否则返回false。如果是相对目录,则按照当前工作目录检查其相对路径。

3.关闭目录。

void closedir(resource handle);//handle,要关闭的工作目录的句柄。

备注:前面已经了解到,若打开的目录不存在,系统并不会帮我们创建目录。那麽我们可以自行创建想要的目录。可以应用以下函数:

mkdir()函数:新建一个目录,成功则返回true,否则false。

rmdir()函数:删除目录。目录必须为空(目录中无文件或者子目录),且要有操作的权限。

unlink()函数:删除文件,成功则返回true,失败返回false。

文件上传、下载原理 

 
步骤内容:

步骤1:控制上传文件,通过php.ini文件配置。

步骤2:对上传文件进行判断。上传文件的大小,格式等。

步骤3:执行上传文件的操作方法。

1.控制上传文件:

php通过对php.ini对上传文件进行控制,包括:是否支持上传、上传文件的临时目录、上传文件的大小、指令执行的时间与指令分配的内存空间。

在php.ini文件中定位到file uploads选项,完成对上述选项的设置。选项含义如下:

file_uploads:如果是on,说明服务器支持文件上传,如果为off,则不支持。一般默认是支持的,此选项不必修改。

upload_tem_dir:上传文件的临时目录。在文件上传成功之前,文件首先保存在服务器的临时目录中。多数使用系统默认目录,但是也可以自行设置。

upload_max_filesize:服务器允许上传文件的最大值,以MB为单位。系统默认为2MB,若超过则须修改其值。

max_execution_time:php中一个指令所能执行的最长时间,单位是秒。该指令在执行上传超大文件时必须修改,否则及时上传文件在服务器允许的范围内,但是超过指令所能执行的最长时间,仍然无法实现上传。

memory_limit:php中一个指令所分配的内存空间,单位时MB。它的大小同样会影响到超大文件的上传。

备注:在客户端中控制上传文件应用的时form表单中的enctype和method属性,以及隐藏域MAX_FILE_SIZE.

enctype="multipart/form-data":指定表单编码数据方式。

method="post":指定数据传输的方式。

<input type="hiden" name="MAX_FILE_SIZE" value="1000"/>:通过隐藏域控制上传文件的大小,单位为字节。该值不能超过php.ini配置文件中的upload_max_filesize选项设置的值。它不能完全控制上传文件的大小,只能避免一些不必要的麻烦。

2.判断上传文件

对上传文件进行判断应用的是全局变量$_FILES,$_FILES是一个数组,它包含所有上传文件的信息。数组中各个元素含义如下:

$_FILES[filename][name]:存储上传文件的文件名,如text.txt,title.jpg等。

$_FILES[filename][size]:存储文件的大小,单位为字节。

$_FILES[filename][tem_name]:存储文件在临时目录中使用的文件名,因为文件在上传时首先要将其以临时文件的身份存储在临时目录中。

$_FILES[filename][type]:存储上传文件的MIME类型。MIME规定各种文件格式的类型,每种MIME类型都时由“/”分隔的主类型和子类型组成。例如:"image/gif"的主类型为图像,子类型为GIF格式的文件。"text/html"代表文本的HTML文件。

$_FILES[filename][error]:存储文件上传的错误代码:此项目为PHP4.2.0版本中新增内容。它的返回值由5种:

0:表示没有任何错误。文件上传成功。

1:表示上传文件的大小超出配置文件指令upload_max_filesize选项的限定值。

2:表示上传文件的大小超出HTML表单中max_file_size选项所指定的值。

3:表示文件只被上传了一部分。

4:表示没有上传任何文件。
例子:

<?php 
/*判断是否由上传图片*/ 
if(!empty($_FILES['up_picture'][name])){ 
/*将图片信息赋值给变量*/ 
$type=strtolower(strstr($_FILES['up_picture'][name],".")); 
if($type != '.jpg' && $type != '.gif') echo "你上传的文件格式不对"; 
else{ 
if($_FILES['up_picture'][size]<2000000 && $_FILES['up_picture'][size]>0){ 
echo "上传文件名称:".$_FILES['up_picture'][name]."<br/>"; 
echo "上传文件类型:".$type."<br/>"; 
echo "上传文件大小:".$_FILES['up_picture'][size]."<br/>"; 
}else echo "图片大小不符合要求。"; 
} 
} 
?>

3.文件上传。

php中应用move_uploaded_file()函数实现文件上传。但在执行之前,为了防止潜在的攻击对原本不能通过脚本交互的文件进行非法管理,可以先应用is_uploaded_file()函数判断指定的文件是否通过HTTP POST上传的,如果是则返回true。通过该函数,可以确保恶意的用户无法欺骗脚本去访问不能访问的文件。

 bool is_uploaded_file(string name);//用于判断指定的文件是否通过HTTP POST上传的。filename必须类似于$_FILES[‘filename'][‘temp_name']的变量,不可以使用从客户端上传的文件名$_FILES[‘filename'][‘name']。

 move_upload_file(string filename,string destination);//该函数用于将文件上传到服务器中指定的位置。如果成功,则返回true,否则返回false。filename指定上传文件的临时文件名,即$_FILES['tmp_name'],参数destination指定文件上传后保存的新路径和名称。如果参数不是合法的上传文件,不会出现任何操作,该函数将返回false。如果是合法的上传操作,但是由于某些原因无法移动,则不会出现任何操作,返回false的同时将会发出一条警告。

<?php 
if( !empty($_FILES[ 'up_picture' ][ 'name' ])){ 
if( $_FILES['up_picture']['error'] > 0){ 
echo "上传错误!"; 
switch($_FILES['up_picture']['error']){ 
case 1: 
echo "上传文件超出配置文件规定值"; 
break; 
case 2: 
echo "上传文件超出表单规定值"; 
break; 
case 3: 
echo "上传文件不全"; 
break; 
case 4: 
echo "没有上传文件"; 
break; 
} 
}else{ 
if( ! is_dir('./upfile/') ) mkdir('./upfile/'); 
$path='./upfile/'.time().$_FILES['up_picture' ][ 'name' ]; 
if( is_uploaded_filed( $_FILES['up_picture' ][ 'tmp_name' ] )){ 
if(!move_uploaded_file( $_FILES['up_picture' ][ 'tmp_name' ] ,$path )){ 
echo "上传失败!"; 
}else{ 
echo "文件".time().$_FILES['up_picture' ][ 'name' ] ."上传成功,大小为:".$_FILES['up_picture' ][ 'size' ] ; 
} 
}else{ 
echo "上传文件".$_FILES['up_picture' ][ 'name' ]."不合法"; 
} 
} 
} 
?>

4.文件下载

这?介绍通过http方式下载文件,主要用到header()函数。header()函数属于HTTP函数,其作用是以HTTP将HTML文档的表头送到浏览器,并告诉浏览器具体怎麽处理这个页面。
void header(string string[,bool replace[,int http_respone_code]]);//参数string 指定发送的标头。参数replace控制如果一次发送多个标头,对于相似的标头是替换还是添加。如果是false,则强制发送多个同类型的标头,默认为true。参数http_respone_code强制将HTTP响应代码设置为指定值:
下载步骤如下:

a):通过"Content-Type" 指定文件的MIME类型。

b):通过"Content-Disposition" 对文件进行描述,值"attachment;filename="test.jpg"" 说明是一个福建,同时指定下载文件的名称。

c):通过"Content-Length" 设置下载文件的大小。
d):通过readfile()函数读取文件内容。
例如:

header('Content-Type:image/jpg'); 
header(' Content-Disposition:attachment;filename="test.jpg" '); 
header('Content-Length:'.filesize('test.jpg') ); 
readfile('test.jpg');

5.访问远程文件

步骤1:配置 php.ini 文件选项 allow_url_fopen设置为on。参数默认是开??的,允许打开http和ftp指定的远程文件。如果 allow_url_fopen设置为off,则不允许打开远程文件。

步骤2:使用fopen()函数读取文件内容。根据内容创建你想要的资源,保存到本地。


ps:更多php.ini配置文件中的文件操作 和 目录操作的扩展方法请参考官方php指南。

PHP 相关文章推荐
搜索和替换文件或目录的一个好类--很实用
Oct 09 PHP
自定义php类(查找/修改)xml文档
Mar 26 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
Jun 23 PHP
php+ajax实现无刷新动态加载数据技术
Apr 28 PHP
基于PHP实现假装商品限时抢购繁忙的效果
Oct 16 PHP
yii2中的rules 自定义验证规则详解
Apr 19 PHP
PHP记录和读取JSON格式日志文件
Jul 07 PHP
PHP简单字符串过滤方法示例
Sep 04 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
Jun 11 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
PHP 面向对象详解
Sep 13 #PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
Sep 13 #PHP
PHP基础陷阱题(变量赋值)
Sep 12 #PHP
php中判断文件存在是用file_exists还是is_file的整理
Sep 12 #PHP
PHP中file_exists与is_file,is_dir的区别介绍
Sep 12 #PHP
PHP中几种常见的超时处理全面总结
Sep 11 #PHP
PHP UTF8中文字符截断函数代码
Sep 11 #PHP
You might like
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
php绘制一个矩形的方法
2015/01/24 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
js实现的订阅发布者模式简单示例
2020/03/14 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
[01:01:24]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python实现简单的可逆加密程序实例
2015/03/05 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
多个应用共存的Django配置方法
2018/05/30 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
python学习将数据写入文件并保存方法
2020/06/07 Python
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
新年爱情寄语
2014/04/08 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
工作收入证明模板
2014/10/10 职场文书
银行竞聘报告范文
2014/11/06 职场文书
语文复习计划
2015/01/19 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
六年级情感作文之500字
2019/10/23 职场文书
Python实现照片卡通化
2021/12/06 Python
详解Python flask的前后端交互
2022/03/31 Python