- 文件编程初步认识
- 文件编程的必要性
- 文件操作的分类
- 目录操作:文件夹,用来存放文件的特殊文件
- 文件操作:用来存放内容
- 目录操作
- 文件操作创建目录结构
- mkDir(路径名字):创建成功返回true,创建失败返回false(有些操作为的就是得到一个想要的结果,如果结果本身就存在,那么可以忽略得到过程的错误:抑制错误)
- 删除目录rmDir(指定文件夹路径):移出文件夹
- 读取目录
- openDir():打开资源,返回一个路径资源,包含指定目录下的所有文件(文件夹)
- readDir():从资源中读取指针所在位置的文件名字,然后指针下移,直到指针移出资源
- 关闭目录closeDir():关闭资源
- 其他目录操作
- dirName(一个路径):得到的是路径的上一层路径
- realPath(一个路径):得到真实路径(目录路径),如果是文件那么得到的结果是false
- is_dir():判断指定路径是否是一个目录
- scandir():封装版的opendir\readdir\closedir,获取一个指定路径下的所有文件信息,以数组形式返回
- 目录操作
- 递归遍历目录
- 递归遍历目录:指定一个目录的情况下,将其下的所有文件和目录,及其目录内部的所有内容都输出出来。
- 递归算法:将大问题切成相似的小问题(最小单位),然后可以调用解决大问题的方法来解决小问题。
- 递归函数:函数如果自己内部调用自己,该函数称之为递归函数。
- 递归遍历目录的思维逻辑
- ( 设计一个能够遍历一层文件的函数)
- 创建函数
- 安全判定:是路径才访问
- 读取全部内容,遍历输出
- 找到递归点:遍历得到的文件是目录,应该调用当前函数(调用自己):
- 需要构造路径(遍历得到的结果只是文件的名字)
- 需要注意排除.和..
- 判断是路径还是文件
- 递归调用函数
- 找到递归出口:遍历完这个文件夹之后,发现没有任何子文件夹(函数不再调用自己):自带递归出口
- 如何显示层级关系?函数第一次运行遍历的结果是最外层目录,内部调用一次说明进入一个子目录,子目录再调用一次函数进行孙子目录…如果能够在第一次调用的时候给个标记,然后在进入的时候,通过标记的变化来识别层级关系,就可以达到目的:该标记还能代表层次关系:缩进
- 在函数参数中增加一个标记:默认值为0
- 递归调用函数的时候也需要使用该参数:但是是属于当前层级的子层,所以+1
- 根据层级来实现缩进:str_repeat()
- ( 设计一个能够遍历一层文件的函数)
- 文件操作
- PHP5常见文件操作函数
- file_get_contents(文件路径):获取指定文件的所有内容,如果路径不存在最好做安全处理
- file_put_contents(文件路径,内容):将指定内容写入到指定文件内:如果当前路径下不存在指定的文件,函数会自动创建(如果路径不存在,不会创建路径)
- PHP4常见文件操作函数
- fopen(文件路径,打开模式):打开一个文件资源,限定打开模式
- fread(资源,长度):从打开的资源中读取指定长度的内容(字节)
- fwrite(资源,内容):向打开的资源中写入指定的内容
- fclose(资源):关闭资源
- 其他文件操作函数
- is_file():判断文件是否正确(不识别路径)
- filesize():获取文件大小
- file_exists():判断文件是否存在(识别路径)
- unLink():取消文件名字与磁盘地址的连接(删除文件)
- filemtime():获取文件最后一次修改的时间
- fseek():设定fopen打开的文件的指针位置
- fgetc():一次获取一个字符
- fgets():一次获取一个字符串(默认行)
- file():读取整个文件,类似file_get_contents,区别是按行读取,返回一个数组
- PHP5常见文件操作函数
- 文件操作
文件下载:从服务器将文件通过HTTP协议传输到浏览器,浏览器不解析保存成相应的文件。
提供下载方式可以使用HTML中的a标签:点击下载
1、 缺点1:a标签能够让浏览器自动下载的内容有限:浏览器是发现如果解析不了才会启用下载
2、 缺点2:a标签下载的文件存储路径会需要通过href属性写出来,这样会暴露服务器存储数据的位置(不安全)
PHP下载:读取文件内容,以文件流的形式传递给浏览器:在响应头中告知浏览器不要解析,激活下载框实现下载。
1) 指定浏览器解析字符集
2) 设定响应头
a) 设定文件返回类型:image/jpg||application/octem-stream
b) 设定返回文件计算方式:Accept-ranges:bytes
c) 设定下载提示:Content-disposition:attachment;filename=’文件名字’
d) 设定文件大小:Accept-length:文件大小(字节)
3) 读取文件
4) 输出文件
方案1:如果文件较小,可以使用PHP5的文件函数操作:file_get_contents
方案2:文件比较大(网络不好),可以使用PHP4 的文件操作方式:一次读一点
文件操作
- 文件目录的基本知识
- 文件类型(filetype( ) 判断文件的类型)
- 文件处理函数(stat函数返回文件的大部分信息)
- 目录的基本操作
- 目录的方式 ‘/’ 与 ‘\’ 斜杠与反斜杠
- DIRECTORY_SEPARATOR 查看当前系统路径的默认分隔符
- basename( ) 返回当前路径的文件名
- dirname() 返回文件的路径
- pathinfo() 目录名,基本名,扩展名
- opendir( ) 打开目录
- readdir() 返回目录名,需要可操作的目录句柄作为参数
- closedir() 关闭目录,需要可操作的目录句柄作为参数
- rewinddir() 倒回目录句柄
- mkdir() 创建目录
- rmdir() 删除目录
- unlink() 将目录中的每个文件都删掉
- copy($srcFile, $toFile)
- 文件的基本操作
- 文件打开模式
- 打开文件fopen( );
- 关闭文件fclose( );
- 读取文件fread( ); 判断是否到达文件的末尾EOF(end of file) 或者 读取完指定的字节数;
- 写入文件fwrite( );
- fputs( ) 是 fwrite( )的别名函数;
- file_put_contents( )一次性写入文件 , 不需要手动的打开和关闭文件;
- 读取文件方法汇总
1. file_get_contents( )将文件内容读取到字符串
1. feof( ) 判断文件指针是否指向文件末尾;
1. fgets( )读取文件的一行
1. fgetc( )返回当前的一个字符
1. 读取文件所有的内容
1. feof( ), while( ), fread( )
1. fread( ), filesize( )
6. file( )返回文件的每一行组成的数组;
6. readfile( ) 读取文件到缓冲区,可以直接在浏览器显示读取结果
- 移动文件指针
- 文件的锁定机制
- 避免同时多个用户对文件进行操作
- 文件的基本操作函数
- 文件的上传与下载
- is_uploaded_file( )判断是否是post提交的文件上传方法,如果是则返回True;为了使该函数正常的工作,必须使用$_FILES[‘userfile’][‘tmp_name’]作为唯一参数判断文件是上传文件;
- move_uploaded_file( )将上传文件移动到新的位置
- 文件下载:指定头信息
- 文件上传:文件从用户本地电脑通过传输方式(Web表单)保存到服务器所在电脑指定的目录下。
- 增加文件上传的表单:浏览器请求一个服务器的HTML脚本(包含文件上传表单)
- 用户从本地选择一个文件(点击上传框(按钮))
- 用户点击上传:文件会通过物联网传输到服务器上
- 服务器操作系统会将文件保存到临时目录:是以临时文件格式保存(windows下tmp)
- 服务器脚本开始工作:判断文件有效
- 服务器脚本将有效文件从临时目录移动到指定的目录下(完成)
- 表单写法
- method属性:表单提交方式必须为POST
- enctype属性:form表单属性,主要是规范表单数据的编码方式
- 属性值
- 在PHP中,有一个预定义变量$_FILES是专门用来存储用户上传的文件的。
- $_FILES变量详解
- name:文件在用户电脑上实际存在的名字(实际用来保留后缀)
- tmp_name:文件上传到服务器后操作系统保存的临时路径(实际用来给PHP后期使用)
- type:MIME(多功能互联网邮件扩展)类型,(确定软件)
- error:文件上传的代号,用来告知应用软件(PHP)文件接收过程中出现了什么问题
- size:文件大小(PHP根据实际需求来确定是否该保留)
- 移动临时文件到目标位置
- 文件上传之后会保存到$_FILES中,那么访问文件信息的形式就是$_FILES[‘表单name属性值’][‘元素信息’]
- 判断是否为上传的文件:is_uploaded_file()
- 移动文件:move_uploaded_file()
- 多文件上传
- 多文件上传的$_FILES变量的数据结构形式
- 批量上传:同名表单:将表单名字形成一个数组,而且同时将文件对应的五个要素:nameTmp_name、size、type、error都形成对应数量的数组,每个文件上传对应数组元素的下标都是一样的:name[0] 和type[0]是属于同一个文件
- 批量上传:不同名表单:每个文件都会形成一个属于自己独立的5个元素的数组
- 对多文件信息的遍历读取和处理
- 同名多文件上传:想办法得到一个文件对应的五个元素数组。从$_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)命名冲突的处理:上传同名文件?中文名字文件怎么办?