PHP 文件系统详解

文件处理函数
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:独佔锁定)。context一个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:取得独佔锁定(写入)。lock_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指南。

(0)

相关推荐

  • PHP开发文件系统实例讲解

    PHP中有许多与文件系统有关的函数,这些函数不仅可以打开文件,还可以显示目录中的内容.移动文件和其他一些功能,许多人甚至用PHP开发基于互联网的文件资源管理器. 下面的脚本样例可以显示一个目录清单,注释已经包含在代码中: <? /把要读取的目录的全路径名存入一个名字为$dir_name的变量中./ $dir_name = "/home/me/"; / 创建一个句柄,其值是打开一个给定目录的结果/ $dir = opendir($dir_name); / 建立一个文字块,用

  • php中的filesystem文件系统函数介绍及使用示例

    basename - 返回路径中的文件名部分dirname - 返回路径中的目录部分 复制代码 代码如下: string basename ( string $path [, string $suffix ] )string dirname ( string $path ) 示例: 复制代码 代码如下: <?php$path = "/home/httpd/phpha.com/index.php";echo basename($path);echo basename($path,

  • 使用PHP维护文件系统

    PHP有很多与文件系统相关的函数,不仅可以帮助你打开文件,还可以显示目录内容.移动文件等.很多人甚至使用PHP写出了基于Web的文件管理器. 首先需要提醒一些关于文件路径的东西:在Windows你可以在文件路径中使用斜线"/"或反斜线"\",而其他操作系统仅使用"/".出于兼容性考虑,以下实例使用"/"的表示方法: 下面的简单脚本显示了一个基本的目录列表.注释在代码中并解释了每一步: <? /* 在变量 $dir_nam

  • Docker核心组件之联合文件系统详解

    目录 1. 联合文件系统的定义 2. 配置 Docker 的 AUFS 模式 3. AUFS 工作原理 3.1 AUFS 如何存储文件 3.2 AUFS 如何工作 4. AUFS 演示 4.1 准备演示目录和文件 4.2 创建 AUFS 联合文件系统 4.3 验证 AUFS 的写时复制 1. 联合文件系统的定义 联合文件系统(Union File System,Unionfs)是一种分层的轻量级文件系统,它可以把多个目录内容联合挂载到同一目录下,从而形成一个单一的文件系统,这种特性可以让使用者像

  • PHP 文件系统详解

    文件处理函数 1.文件操作. 打开文件: 打开指定的文件时会返回相应的对象,若不存在指定的文件,那麽可能会自动创建这个文件. resource fopen(string filename,string mode [,int use_include_path][,resource context]); filename 可以是包含文件路径的文件名,也可以是某种协议给出的URL(打开远程文件).为了避免系统切换带来的麻烦,采用'/'作为路径分隔符. mode: 设置打开文件的方式,分别有: r:只读

  • Node.js测试中的Mock文件系统详解

    Mock文件系统相关的工具包括: Mock fs 模块的工具mock-fs . Mock require 模块的工具mock-require . 安装 mock-fs和 mock-require 都是NPM软件包,在项目中可通过npm直接安装: npm install mock-fs mock-require --save Mock fs 模块 通过mock()方法可以创建多个文件的Mock并立即生效, 此后对fs的调用都会访问这些Mock文件. 调用mock.restore()可取消Mock并

  • 使用Java Minio搭建自己的文件系统详解

    目录 前言 1.Minio介绍 2.Minio安装与启动 3.Minio控制台创建存储桶 4.存储桶权限 5.控制台实现文件的上传与下载 6.使用Springboot与Minio整合实现文件的增删查改 6.1.创建项目 6.2.添加依赖 6.3.创建自定义属性与配置类 6.4.功能实现 6.4.1.文件上传 6.4.2.文件下载 6.4.3.查询全部文件 6.4.4.删除指定文件 总结 前言 最近接了一个项目,甲方不愿意买服务器,但是呢,项目又必须要用文件功能.所以很巧,最近又刚好看到了Mini

  • 详解nodeJs文件系统(fs)与流(stream)

    一.简介 本文将介绍node.js文件系统(fs)和流(stream)的一些API已经参数使用情况. 二.目录 文件系统将介绍以下方法: 1.fs.readFile 2.fs.writeFile 3.fs.open 4.fs.read 5.fs.stat 6.fs.close 7.fs.mkdir 8.fs.rmdir 9.fs.readdir 10.fs.unlink stream流的四种类型readable,writable,duplex,transform以及stream对象的事件. 三.

  • NodeJs 文件系统操作模块fs使用方法详解

    NodeJs:文件读取API使用方法 - - readFile() 需求:使用Node中提供的文件操作API,读取files目录下的1.txt 文档中文本内容. Node的三个组成部分:ECMAScript核心 + 全局成员 + 核心API成员 核心API成员,在大家安装Node应用程序的时候,就已经安装到了自己的电脑中. 如果想要访问核心成员,直接使用require("核心成员的名称"),就能够导入并使用这些核心成员. const fs = require("fs"

  • 移植busybox构建最小根文件系统的步骤详解

    Busybox:瑞士军刀,里面装有很多小命令. STEP 1:构建目录结构 创建根文件系统目录,主要包括以下目录 /dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys #mkdir /home/rootfs #cd /home/rootfs #mkdir dev etc lib usr var proc tmp home root mnt sys STEP 2: 使用busybox构建/bin /sbin lin

  • 详解删除SQL Server 2005 Compact Edition数据库

    详解删除SQL Server 2005 Compact Edition数据库 本主题将介绍如何删除 Microsoft SQL Server 2005 Compact Edition (SQL Server Compact Edition) 数据库.由于 SQL Server Compact Edition 数据库是文件系统中的文件,因此需要通过删除文件来删除 SQL Server Compact Edition 数据库. 删除 SQL Server Compact 数据库 调用 System.

  • 基于tomcat配置文件server.xml详解

    1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置极其简单,只需修改$CATALINA_HOME/conf/server.xml文件为如下内容即可.其中大部分都采用了默认设置,只是在engine容器中添加了两个Host容器. <?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SH

  • Docker探索namespace详解

    Docker通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时复制(copy-on-write)实现了高效的文件操作. 1.namespace资源隔离 namepsace的6项隔离: namespace 系统调用参数 隔离内容 UTS CLONE_NEWUTS 主机名与域名 IPC CLONE_NEWIPC 信号量,消息队列和共享内存 PID CLONE_NEWPID 进程编号 Network CLONE_NEWNET 网络设备,网络栈,端口等 Mount CLON

随机推荐