1. 文件编程初步认识
    2. 文件编程的必要性
    3. 文件操作的分类
      1. 目录操作:文件夹,用来存放文件的特殊文件
      2. 文件操作:用来存放内容
    4. 目录操作
    5. 文件操作创建目录结构
      1. mkDir(路径名字):创建成功返回true,创建失败返回false(有些操作为的就是得到一个想要的结果,如果结果本身就存在,那么可以忽略得到过程的错误:抑制错误)
    6. 删除目录rmDir(指定文件夹路径):移出文件夹
    7. 读取目录
      1. openDir():打开资源,返回一个路径资源,包含指定目录下的所有文件(文件夹)
      2. readDir():从资源中读取指针所在位置的文件名字,然后指针下移,直到指针移出资源
    8. 关闭目录closeDir():关闭资源
    9. 其他目录操作
      1. dirName(一个路径):得到的是路径的上一层路径
      2. realPath(一个路径):得到真实路径(目录路径),如果是文件那么得到的结果是false
      3. is_dir():判断指定路径是否是一个目录
      4. scandir():封装版的opendir\readdir\closedir,获取一个指定路径下的所有文件信息,以数组形式返回
    10. 目录操作
    11. 递归遍历目录
      1. 递归遍历目录:指定一个目录的情况下,将其下的所有文件和目录,及其目录内部的所有内容都输出出来。
      2. 递归算法:将大问题切成相似的小问题(最小单位),然后可以调用解决大问题的方法来解决小问题。
      3. 递归函数:函数如果自己内部调用自己,该函数称之为递归函数。
      4. 递归遍历目录的思维逻辑
        1. ( 设计一个能够遍历一层文件的函数)
          1. 创建函数
          2. 安全判定:是路径才访问
          3. 读取全部内容,遍历输出
        2. 找到递归点:遍历得到的文件是目录,应该调用当前函数(调用自己):
          1. 需要构造路径(遍历得到的结果只是文件的名字)
          2. 需要注意排除.和..
          3. 判断是路径还是文件
          4. 递归调用函数
        3. 找到递归出口:遍历完这个文件夹之后,发现没有任何子文件夹(函数不再调用自己):自带递归出口
        4. 如何显示层级关系?函数第一次运行遍历的结果是最外层目录,内部调用一次说明进入一个子目录,子目录再调用一次函数进行孙子目录…如果能够在第一次调用的时候给个标记,然后在进入的时候,通过标记的变化来识别层级关系,就可以达到目的:该标记还能代表层次关系:缩进
          1. 在函数参数中增加一个标记:默认值为0
          2. 递归调用函数的时候也需要使用该参数:但是是属于当前层级的子层,所以+1
          3. 根据层级来实现缩进:str_repeat()
    12. 文件操作
      1. PHP5常见文件操作函数
        1. file_get_contents(文件路径):获取指定文件的所有内容,如果路径不存在最好做安全处理
        2. file_put_contents(文件路径,内容):将指定内容写入到指定文件内:如果当前路径下不存在指定的文件,函数会自动创建(如果路径不存在,不会创建路径)
      2. PHP4常见文件操作函数
        1. fopen(文件路径,打开模式):打开一个文件资源,限定打开模式
        2. fread(资源,长度):从打开的资源中读取指定长度的内容(字节)
        3. fwrite(资源,内容):向打开的资源中写入指定的内容
        4. fclose(资源):关闭资源
      3. 其他文件操作函数
        1. is_file():判断文件是否正确(不识别路径)
        2. filesize():获取文件大小
        3. file_exists():判断文件是否存在(识别路径)
        4. unLink():取消文件名字与磁盘地址的连接(删除文件)
        5. filemtime():获取文件最后一次修改的时间
        6. fseek():设定fopen打开的文件的指针位置
        7. fgetc():一次获取一个字符
        8. fgets():一次获取一个字符串(默认行)
        9. file():读取整个文件,类似file_get_contents,区别是按行读取,返回一个数组
    13. 文件操作

    文件下载:从服务器将文件通过HTTP协议传输到浏览器,浏览器不解析保存成相应的文件。
    提供下载方式可以使用HTML中的a标签:点击下载
    1、 缺点1:a标签能够让浏览器自动下载的内容有限:浏览器是发现如果解析不了才会启用下载
    2、 缺点2:a标签下载的文件存储路径会需要通过href属性写出来,这样会暴露服务器存储数据的位置(不安全)


    PHP下载:读取文件内容,以文件流的形式传递给浏览器:在响应头中告知浏览器不要解析,激活下载框实现下载。
    1) 指定浏览器解析字符集
    image.png

    2) 设定响应头
    a) 设定文件返回类型:image/jpg||application/octem-stream
    b) 设定返回文件计算方式:Accept-ranges:bytes
    c) 设定下载提示:Content-disposition:attachment;filename=’文件名字’
    d) 设定文件大小:Accept-length:文件大小(字节)
    image.png

    3) 读取文件
    4) 输出文件
    方案1:如果文件较小,可以使用PHP5的文件函数操作:file_get_contents
    image.png

    方案2:文件比较大(网络不好),可以使用PHP4 的文件操作方式:一次读一点
    文件操作

    1. 文件目录的基本知识
      1. 文件类型(filetype( ) 判断文件的类型)

    image.png

    1. 文件处理函数(stat函数返回文件的大部分信息)

    image.png

    1. 目录的基本操作
      1. 目录的方式 ‘/’ 与 ‘\’ 斜杠与反斜杠
      2. DIRECTORY_SEPARATOR 查看当前系统路径的默认分隔符
      3. basename( ) 返回当前路径的文件名
      4. dirname() 返回文件的路径
      5. pathinfo() 目录名,基本名,扩展名
      6. opendir( ) 打开目录
      7. readdir() 返回目录名,需要可操作的目录句柄作为参数
      8. closedir() 关闭目录,需要可操作的目录句柄作为参数
      9. rewinddir() 倒回目录句柄
      10. mkdir() 创建目录
      11. rmdir() 删除目录
      12. unlink() 将目录中的每个文件都删掉
      13. copy($srcFile, $toFile)
    2. 文件的基本操作
      1. 文件打开模式

    image.png

    1. 打开文件fopen( );
      1. 关闭文件fclose( );
      2. 读取文件fread( ); 判断是否到达文件的末尾EOF(end of file) 或者 读取完指定的字节数;
      3. 写入文件fwrite( );
      4. fputs( ) 是 fwrite( )的别名函数;
      5. file_put_contents( )一次性写入文件 , 不需要手动的打开和关闭文件;
    2. 读取文件方法汇总

    image.png

    1. 1. file_get_contents( )将文件内容读取到字符串
    2. 1. feof( ) 判断文件指针是否指向文件末尾;
    3. 1. fgets( )读取文件的一行
    4. 1. fgetc( )返回当前的一个字符
    5. 1. 读取文件所有的内容
    6. 1. feof( ), while( ), fread( )
    7. 1. fread( ), filesize( )
    8. 6. file( )返回文件的每一行组成的数组;
    9. 6. readfile( ) 读取文件到缓冲区,可以直接在浏览器显示读取结果
    • 移动文件指针

    image.png

    1. 文件的锁定机制
      1. 避免同时多个用户对文件进行操作

    image.png

    1. 文件的基本操作函数

    image.png

    1. 文件的上传与下载
      1. is_uploaded_file( )判断是否是post提交的文件上传方法,如果是则返回True;为了使该函数正常的工作,必须使用$_FILES[‘userfile’][‘tmp_name’]作为唯一参数判断文件是上传文件;
      2. move_uploaded_file( )将上传文件移动到新的位置
      3. 文件下载:指定头信息
      4. 文件上传:文件从用户本地电脑通过传输方式(Web表单)保存到服务器所在电脑指定的目录下。
      5. 增加文件上传的表单:浏览器请求一个服务器的HTML脚本(包含文件上传表单)
      6. 用户从本地选择一个文件(点击上传框(按钮))
      7. 用户点击上传:文件会通过物联网传输到服务器上
      8. 服务器操作系统会将文件保存到临时目录:是以临时文件格式保存(windows下tmp)
      9. 服务器脚本开始工作:判断文件有效
      10. 服务器脚本将有效文件从临时目录移动到指定的目录下(完成)
    2. 表单写法
      1. method属性:表单提交方式必须为POST
      2. enctype属性:form表单属性,主要是规范表单数据的编码方式
      3. 属性值

    image.png

    1. 在PHP中,有一个预定义变量$_FILES是专门用来存储用户上传的文件的。
      • $_FILES变量详解
    2. name:文件在用户电脑上实际存在的名字(实际用来保留后缀)
    3. tmp_name:文件上传到服务器后操作系统保存的临时路径(实际用来给PHP后期使用)
    4. type:MIME(多功能互联网邮件扩展)类型,(确定软件)
    5. error:文件上传的代号,用来告知应用软件(PHP)文件接收过程中出现了什么问题
    6. size:文件大小(PHP根据实际需求来确定是否该保留)
      • 移动临时文件到目标位置
    7. 文件上传之后会保存到$_FILES中,那么访问文件信息的形式就是$_FILES[‘表单name属性值’][‘元素信息’]
    8. 判断是否为上传的文件:is_uploaded_file()
    9. 移动文件:move_uploaded_file()
      • 多文件上传
    10. 多文件上传的$_FILES变量的数据结构形式
    11. 批量上传:同名表单:将表单名字形成一个数组,而且同时将文件对应的五个要素:nameTmp_name、size、type、error都形成对应数量的数组,每个文件上传对应数组元素的下标都是一样的:name[0] 和type[0]是属于同一个文件
    12. 批量上传:不同名表单:每个文件都会形成一个属于自己独立的5个元素的数组
      • 对多文件信息的遍历读取和处理
    13. 同名多文件上传:想办法得到一个文件对应的五个元素数组。从$_FILES中把对应的name\tmp_name\size\error\type挨个取出来,然后存放到不同的数组中。
      • 文件上传后续问题

    实现上传功能代码的重复利用:封装文件上传函数
    功能:上传文件
    条件:条件判断
    需要上传的文件信息:对应的5个元素的数组
    1、 文件类型是否合适?外部指定MIME类型
    2、 文件存储到什么位置?外部指定
    3、 文件格式限制(文件后缀)?外部限定
    4、 文件大小限制?外部指定
    结果:实现文件上传
    1、 成功:结果能够在以后看到:需要将文件的路径和文件名字返回(存储到数据库)
    2、 失败:返回false,指定错误原因(引用参数)

    1)封装出一个上传函数2)判断文件是否有效33)判断保存路径是否有效
    4)判断文件本身上传的过程中是否有错误:error
    5)文件类型的处理:通过MIME匹配即可
    6)文件格式的处理:后缀名的问题
    7)文件大小的处理
    8)移动到指定目录
    8)命名冲突的处理:上传同名文件?中文名字文件怎么办?