批改状态:合格
老师批语:filesystem以及directory系列函数掌握以后, 对于文件目录的操作就会更灵活~
1、简单写文件:
// 写数据到指定文件中file_put_contents("文件名","数据字符串");
2、简单读文件:
// 从指定文件中读取内容$file=file_get_contents(“文件名”);// 获取某个网页源码到文件中file_put_contents("index.html",file_get_contents("http://php.cn/"));
3、读文件并输出:
readfile("ww.txt"); // 也可传递URL,内容自接输出无需加echo等
4、读文件以行为单位存入数组:
$arr=file("文件名");echo $arr[0]; // 第一行内容echo$arr[1]; // 第二行内容
5、取目录名:
dirname($文件路径字符串) // 返回目录字符串
6、获取文件名:
basename("字符串"); // 获取文件名
7、创建目录:
// 创建的目录必须是一个不存在的,存在会出现错误 //第二个参数如:0777mkdir(“目录名字符串“);
8、删除空目录:
rmdir("空目录名"); // 返回bool
9、创建文件:
touch("文件名"); // 返回bool
10、删除文件:
unlink("文件名或文件名路径");
11、检查文件或目录是否存在:
file_exists(“文件字符串”); // 返回bool
12、基本判断(内容必须存在):判断是否是目录【is_dir(“字符串”)】、 判断是否是文件【is_file(“字符串”)】
13、获取文件修改时间:filemtime(“文件字符串”);//返回时间戳
14、获取文件大小:filesize(“文件字符串”);//返回字节数
15、文件重命名和移动:rename(“原文件”,”新文件”);//返回bool
16、文件复制:copy(“原文件”,”新文件”);//返回bool
17、文件权限:【is_readable()】、【is_writable()】【is_executable()】//读 写 执行
18、目录分隔符:DIRECTORY_SEPARATOR; // 在liux系统为“/”,在win下为“\”
19、换行符:PHP_EOL // 在liux系统为“\n”,在win下位“\r\n”
20、获取磁盘总大小:echo disk_total_space(“C:”);//返回字节数
21、获取磁盘可用空间总大小:echo disk_free_space(“C:”);//返回字节数
echo “C磁盘总大小:”.round(disk_total_space(“C:”)/pow(2,30),2).”G”;//打印以G为单位大小
22、目录:当前目录(点加斜杠)【 . / 】,上级目录(点点加斜杠)【 . . / 】
23、打印目录下文件:
print_r(glob("./admin/config/*php")); // 获取文件夹admin/config下的php文件,无到子目录,只返回当前目录下
24、遍历文件夹:
$dir=opendir("./dirdong");//打开文件资源while($fi=readdir($dir)){//循环if(is_dir("./dirdong/".$fi)) echo "目录:".$fi."<br/>";if(is_file("./dirdong/".$fi)) echo "文件:".$fi."<br/>";}closedir($dir);//关闭文件资源
25、利用文件指针的方式读写文件:
/*打开模式:r 只读方式,文件指针处于开始r+ 读写方式,文件指针处于开始,文件无报错w 只写方式,文件指针处于开始w+ 读写方式,文件指针处于开始,文件无则创建a 写追加方式,文件指针处于末尾,文件无则创建a+ 读写方式,文件指针处于末尾,文件无则创建rb wb 二进制读写方式rt wt 文本方式读写方式*/$f=fopen("ww.txt","r+");//打开文件 ww.txt 资源fseek($f,3);//从前往后移动文件指针3个字节fseek($f,-2,SEEK_END);//从后往前移动文件指针2个字节rewind($f);//将指针数组移动至开头echo ftell($f);//查看文件指针位置//循环读取文件内容//while(!feof($f)){//判断文件结尾//echo fgetc($f);//只读取一个字节//}//echo fgets($f);//一次读一行//echo fread($f,2);//读取两个字节//fwrite($f,"32w东小东\nxxx");//写内容fclose($f);//关闭文件资源
26、文件锁,防止同时操作文件造成数据絮乱:
flock($f,LOCK_EX);//设置写锁,返回boolflock($f,LOCK_SH);//设置读锁,返回bool//文件读写操作flock($f,LOCK_UN);//释放锁,返回bool
27、文件上传到服务器:
HTML:
<form action="wan.php" method="post" enctype="multipart/form-data"><input type="text" name="namexx"><br><input type="file" name="filexx"><br/><input type="submit" value="东小东上传"></form>
PHP:
//error_reporting("E_ALL & ~ E_NOTICE");//post数据,无文件数据print_r($_POST);//文件数据 名字,类型,零时目录,大小等print_r($_FILES["filexx"]);//设置保存地址$filepath="img/".$_POST["namexx"];//拷贝零时文件到保存目录if(move_uploaded_file($_FILES["filexx"]["tmp_name"],$filepath)){echo "上传成功";}else{echo "上传失败";}
文件上传错误值:

28、多文件上传基本思路:利用文件数组
<input type="file" name="filexx[]" multiple>
29、文件下载:通过返回头告诉客户端此为附件即可
//告诉浏览器此文件为附件(可下载,不用浏览器解析)header("Content-Disposition:attachment;filename=任意文件名1");//输出内容readfile("任意文件名1");
文件上传是 PHP 文件系统的重要功能之一,要使用文件上传功能,我们首先需要在配置文件 php.ini 中对上传做一些设置;然后通过预定义变量 $_FILES 对上传文件做一些限制和判断;最后使用 move_uploaded_file() 函数来实现上传。
实现文件上传功能,首先要在 php.ini 中开启文件上传,并对其中的一些参数作出合理的设置。找到 Uploads 项,可以看到下面 3 个属性值,其含义如下:
除了 File Uploads 项,还有几个属性也会影响到上传文件的功能:
一般情况下将 php.ini 配置称下面的样子即可,当然也可以根据自己的需求做相应的调整。
; Whether to allow HTTP file uploads.; http://php.net/file-uploadsfile_uploads = On; Temporary directory for HTTP uploaded files (will use system default if not; specified).; http://php.net/upload-tmp-dir;upload_tmp_dir =; Maximum allowed size for uploaded files.; http://php.net/upload-max-filesizeupload_max_filesize = 100M; Maximum number of files that can be uploaded via a single requestmax_file_uploads = 100; Maximum amount of memory a script may consume (128MB); http://php.net/memory-limitmemory_limit=256M; Maximum execution time of each script, in seconds; http://php.net/max-execution-time; Note: This directive is hardcoded to 0 for the CLI SAPImax_execution_time = 300
文件上传项目项在
php.ini中设置,常用的配置项有:
| 序号 | 配置项 | 默认值 | 描述 |
|---|---|---|---|
| 1 | file_uploads |
On |
使 PHP 支持文件上传 |
| 2 | upload_tmp_dir |
/tmp |
指示应该临时把上传的文件存储在什么位置 |
| 3 | max_file_uploads |
20 |
单次请求时允许上传的最大文件数量 |
| 4 | max_execution_time |
30 |
设置脚本被解析器终止之前PHP最长执行时间(秒) ,防止服务器资源被耗尽 |
| 5 | max_input_time |
60 |
设置 PHP 通过 POST/GET/PUT 解析接收数据的时长(秒) |
| 6 | memory_limit |
128M |
系统分配给当前脚本执行可用的最大内存容量 |
| 7 | post_max_size |
8M |
允许的 POST 数据的总大小 |
| 8 | upload_max_filesize |
32M |
允许的尽可能最大的文件上传 |
$_FILE$_FILES 变量存储的是上传文件的相关信息,这些信息对于上传功能有很大的作用。该变量是一个二维数组。
$_FILES中$_FILES以二维数组形式保存: $_FILES['form_file_name']['key']'form_file_name': 对应着表单中<input type="file" name="my_pic">中name属性值'key': 共有 5 个键名, 描述如下:| 序号 | 键名 | 描述 |
|---|---|---|
| 1 | name |
文件在客户端的原始文件名(即存在用户电脑上的文件名) |
| 2 | type |
文件的 MIME 类型, 由浏览器提供, PHP 并不检查它 |
| 3 | tmp_name |
文件被上传到服务器上之后,在临时目录中临时文件名 |
| 4 | error |
和该文件上传相关的错误代码 |
| 5 | size |
已上传文件的大小(单位为字节) |
| 序号 | 常量 | 值 | 描述 |
|---|---|---|---|
| 1 | UPLOAD_ERR_OK |
0 |
没有错误发生,文件上传成功 |
| 2 | UPLOAD_ERR_INI_SIZE |
1 |
文件超过php.ini中upload_max_filesize值 |
| 3 | UPLOAD_ERR_FORM_SIZE |
2 |
文件大小超过表单中MAX_FILE_SIZE指定的值 |
| 4 | UPLOAD_ERR_PARTIAL |
3 |
文件只有部分被上传 |
| 5 | UPLOAD_ERR_NO_FILE |
4 |
没有文件被上传 |
| 6 | UPLOAD_ERR_NO_TMP_DIR |
6 |
找不到临时文件夹 |
| 7 | UPLOAD_ERR_CANT_WRITE |
7 |
文件写入失败 |
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>PHP文件上传</title></head><body><form action="" method="post" enctype="multipart/form-data"><input type="file" name="upfile"><input type="submit" value="上传"></form></body></html><?phpif(!empty($_FILES)){// $_FILES["file"]["error"] 由文件上传导致的错误代码if ($_FILES["upfile"]["error"] > 0){echo "Error: " . $_FILES["upfile"]["error"] . "<br />";}else{// 被上传文件的名称echo "Upload: " . $_FILES["upfile"]["name"] . "<br />";// 被上传文件的类型echo "Type: " . $_FILES["upfile"]["type"] . "<br />";// 被上传文件的大小,字节 byteecho "Size: " . ($_FILES["upfile"]["size"] / 1024) . " Kb<br />";// 存储在服务器的文件的临时副本的名称echo "Stored in: " . $_FILES["upfile"]["tmp_name"];}}?>

通过上面的代码我们已经可以获取到上传文件的信息了,通过这些信息再联合 move_uploaded_file() 函数就可以实现文件上传。move_uploaded_file() 函数的主要功能就是将上传的文件移动到新的位置,执行成功时返回 TRUE,否则返回 FALSE
move_uploaded_file(string $filename, string $destination)
其中,$filename 为上传文件的文件名;$destination 为文件要移动到的位置。
注意:$filename 接受的是文件上传后的临时名称而不是文件的原名称,它可以通过
$_FILES["upfile"]["tmp_name"]得到
文件上传一般有下面2种方式:
1、标准input表单方式,典型的用$_FILES进行接收;
2、以Base64的方式进行传送,一般是AJAX异步上传。
<form>标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 “multipart/form-data”。<input>标签的 type=”file” 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。action=""表示当前页面提交,method=”post”传输方式为post前端表单上传文件
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>PHP文件上传</title></head><body><form action="./upload_file.php" method="post" enctype="multipart/form-data"><fieldset><legend>单文件上传</legend><input type="file" name="file"><input type="submit" value="上传"></fieldset></form></body></html>
后端文件上传限制
<?php/*** 文件上传 :客户端上传文件到服务器, 首先存在临时文件夹下, 做一些严格的验证(大小, 后缀,合法文件,),通过以后,移动文件到指定的文件夹*/// 在php文件开头调用以下函数 ini_set()设置php配置文件的单个属性//报告所有错误error_reporting(E_ALL);// 接收错误信息但不打印ini_set("display_errors", "Off");// 开启错误日志ini_set("log_errors", "On");// 设置错误日志文件路径ini_set("error_log", "./error.log");if(!empty($_FILES)){printf('<pre>%s</pre>',print_r($_FILES,true));// 允许上传的图片后缀$allowExts = ['jpg','jpeg','pjpeg','png','wbmp','gif'];$temp = explode(".", $_FILES["file"]["name"]);// 获取文件后缀名$extension = array_pop($temp);if ((($_FILES["file"]["type"] == "image/gif")|| ($_FILES["file"]["type"] == "image/jpeg")|| ($_FILES["file"]["type"] == "image/pjpeg")|| ($_FILES["file"]["type"] == "image/png")|| ($_FILES["file"]["type"] == "image/wbmp"))&& in_array($extension, $allowExts)){if ($_FILES["file"]["error"] > 0){switch($_FILES["file"]["error"]) :case 1:echo '文件超过`php.ini`中`upload_max_filesize`值<br>';break;case 2:echo '文件大小超过表单中`MAX_FILE_SIZE`指定的值<br>';break;case 3:echo '文件只有部分被上传<br>';break;case 4:echo '没有文件被上传<br>';break;case 6:echo '找不到临时文件夹<br>';break;case 6:echo '文件写入失败<br>';break;default:echo 'Error: 系统错误<br>';break;endswitch;}else{$maxSize = '2MB';// 检查文件上传大小 需小于2MBif($_FILES["file"]["size"] > intval($maxSize)*1024*1024){die("图片超大,请上传小于5MB的图片!");}// 检测图片是否合法if(!getimagesize($_FILES['file']['tmp_name'])){die("不是真实图片内容,get out~");}// 检测图片是否通过http post方式上传if(!is_uploaded_file($_FILES['file']['tmp_name'])){die("上传方式错误:请使用http post方式上传");}// 检测uploads文件夹是否存在$destination = "uploads/";// 如果没有 uploads 目录,你需要创建它,uploads 目录权限为 777if(!file_exists($destination)){// 不存在则创建uploads文件夹mkdir($destination,0777,true);chmod($destination,0777);}// 判断当前目录下的 uploads 目录是否存在该文件if (file_exists($destination . $_FILES["file"]["name"])){echo $_FILES["file"]["name"] . " already exists. ";}else{$tmpname = $_FILES['file']['tmp_name']; // 临时文件名称$name = $_FILES['file']['name']; // 文件的原名称$path = './uploads'; // 上传目录$file_name = date('YmdHis').rand(100,999).$name;// 避免文件重名,更改文件名称// 检测是否上传成功if(move_uploaded_file($tmpname, $path.'/'.$file_name)){echo $name." 上传成功!<br>";echo "<img src='./$path/$file_name' width='100'>";}else{echo $name." 上传失败!";}}}}else {echo "非法的文件格式 Invalid file";}}?>



前面我们成功上传了一个文件,但有些时候我们往往需要一次上传多个文件。例如上传相片到博客就需要多个文件同时上传。实现多文件上传也非常简单
在使用 input 上传图片的时候,为了避免用户选择非图片的文件,于是就在 input 标签里面加入了 accept="image/*" 来规定能够上传的文件类型。
multiple支持一次选多个文件,pic[]以数组的形式接收多个文件。手机端端还可以加入参数capture=”camera”选择摄像头拍照上传。
使用multipart属性可以支持多文件上传,允许选中多个文件。
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>PHP多文件上传</title></head><body><form action="" method="post" enctype="multipart/form-data"><input type="file" name="pic[]" multiple capture accept="image/*" ><input type="submit" value="上传"></form></body></html><?phpif(!empty($_FILES)){$tmpname = $_FILES['pic']['tmp_name'];$name = $_FILES['pic']['name'];$path = './uploads';for ($i=0; $i < count($tmpname); $i++) {$file_name = date('YmdHis').rand(100,999).$name[$i];if(move_uploaded_file($tmpname[$i], $path.'/'.$file_name)){echo $name[$i].' 上传成功!<br>';}else{echo $name[$i].' 上传失败!<br>';}}}?>
$_FILES数据格式
array(1) {["pic"] => array(5) {["name"] => array(2) {[0] => string(5) "1.jpg"[1] => string(5) "2.jpg"}["type"] => array(2) {[0] => string(10) "image/jpeg"[1] => string(10) "image/jpeg"}["tmp_name"] => array(2) {[0] => string(27) "C:\Windows\Temp\php7A7E.tmp"[1] => string(27) "C:\Windows\Temp\php7A7F.tmp"}["error"] => array(2) {[0] => int(0)[1] => int(0)}["size"] => array(2) {[0] => int(77357)[1] => int(56720)}}}
不使用multipart属性,设置表单不同的name:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>PHP多文件上传</title></head><body><form action="" method="post" enctype="multipart/form-data"><input type="file" name="id_pic_1" accept="image/*" /><br><input type="file" name="id_pic_2" accept="image/*" /><br><input type="file" name="id_pic_3" accept="image/*" /><br><input type="submit" value="上传"></form></body></html><?phpif(!empty($_FILES)){foreach($_FILES as $k=>$v){$tmpname = $v['tmp_name'];$name = $v['name'];$path = './uploads';$file_name = date('YmdHis').rand(100,999).$name;if(move_uploaded_file($tmpname, $path.'/'.$file_name)){echo $name.' 上传成功!<br>';}else{echo $name.' 上传失败!<br>';}}}?>
$_FILES数据格式
array(1) {["id_pic_1"] => array(5) {["name"] => string(5) "1.jpg"["type"] => string(10) "image/jpeg"["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEE.tmp"["error"] => int(0)["size"] => int(77357)}["id_pic_2"] => array(5) {["name"] => string(5) "2.jpg"["type"] => string(10) "image/jpeg"["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEF.tmp"["error"] => int(0)["size"] => int(56720)}["id_pic_2"] => array(5) {["name"] => string(5) "2.jpg"["type"] => string(10) "image/jpeg"["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEF.tmp"["error"] => int(0)["size"] => int(56720)}}
第一种修改配置文件php.ini,将前面;分号去掉开启对应的配置项
# 错误级别; error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT # 生产; error_reporting = E_ALL | E_STRICT # 默认error_reporting = E_ALL # 开发
# 是否显示错误信息# 开启状态下,若出现错误,则报错,出现错误提示; display_errors = On# 关闭状态下,若出现错误,则提示:服务器错误。但是不会出现错误提示dispaly_errors = Off
# 接收但不显示错误信息的时候,可以开启错误报告log_errors = On# 设置错误报告文件路径error_log="D:\UPUPW\Apache\logs\php_errors.log"
第二种单个脚本文件中设置
// 在php文件开头调用以下函数 ini_set()设置php配置文件的单个属性//禁用错误报告// error_reporting(0);//报告运行时错误// error_reporting(E_ERROR | E_WARNING | E_PARSE);//报告所有错误error_reporting(E_ALL);// 接收错误信息但不打印ini_set("display_errors", "Off");// 开启错误日志ini_set("log_errors", "On");// 设置错误日志文件路径ini_set("error_log", "./error.log");// 输入一个未定义的变量echo $s;
这时候我们同级目录下就会生成一个error.log文件存放着错误信息
[15-May-2021 15:48:51 Asia/Shanghai] PHP Notice: Undefined variable: s in E:\zhang\0514\upload_file.php on line 21
目录结构为:
test|-----upload # 文件上传的目录|-----form.html # 表单文件|-----upload_file.php # php 上传代码
根据需求封装文件上传限制函数:
<?php/*封装文件上传函数*/function uploadFile(array $fileInfo,$uploadPath="./uploads/",$flag = true,array $allowExts=['jpg','jpeg','png','wbmp','gif'],$maxSize="5MB"){if(!empty($fileInfo)){if ($fileInfo['error']>0) {switch($fileInfo['error']) :case 1:$res['mess'] = '文件超过`php.ini`中`upload_max_filesize`值<br>';break;case 2:$res['mess'] = '文件大小超过表单中`MAX_FILE_SIZE`指定的值<br>';break;case 3:$res['mess'] = '文件只有部分被上传<br>';break;case 4:$res['mess'] = '没有文件被上传<br>';break;case 6:$res['mess'] = '找不到临时文件夹<br>';break;case 6:$res['mess'] = '文件写入失败<br>';break;default:$res['mess'] = 'Error: 系统错误<br>';break;endswitch;return $res['mess'];}else{// 按照指定字符拆分为数组$temp = explode(".",$fileInfo["name"]);// 获取文件后缀名$extension = array_pop($temp);if(!in_array($extension, $allowExts)){$res['mess'] = ("该文件格式占不支持!");}$maxSize = '2MB';// 检查文件上传大小 需小于2MBif($fileInfo["size"] > intval($maxSize)*1024*1024){$res['mess'] = ("图片超大,请上传小于{$maxSize}的图片!");}if($flag){// 检测图片是否合法if(!getimagesize($fileInfo['tmp_name'])){$res['mess'] = ("不是真实图片内容,get out~");}}// 检测图片是否通过http post方式上传if(!is_uploaded_file($fileInfo['tmp_name'])){$res['mess'] = ("上传方式错误:请使用http post方式上传");}// 如果以上发生错误,就直接return结束返回错误内容if(!empty($res['mess'])){return $res['mess'];}// 检测uploads文件夹是否存在// 如果没有 uploads 目录,你需要创建它,uploads 目录权限为 777if(!file_exists($uploadPath)){// 不存在则创建uploads文件夹mkdir($uploadPath,0777,true);chmod($uploadPath,0777);}// 判断当前目录下的 uploads 目录是否存在该文件if (file_exists($uploadPath . $fileInfo["name"])){echo $fileInfo["name"] . " already exists. ";}else{$tmpname = $fileInfo['tmp_name']; // 临时文件名称$name = $fileInfo['name']; // 文件的原名称$file_name = md5(date('YmdHis')).rand(100,999).'.'.$extension; // 避免文件重名,更改文件名称$fileRealPath = $uploadPath.$file_name;// 检测是否上传成功if(move_uploaded_file($tmpname, $fileRealPath)){$res['mess'] = $name."图片上传成功!";$res['imgurl'] = $fileRealPath;}else{$res['mess'] = $name."图片上传失败!请检查网络状况……";}return $res['mess'];}}}}?>
利用form表单进行上传
<?php//报告所有错误error_reporting(E_ALL);// 接收错误信息但不打印ini_set("display_errors", "Off");// 开启错误日志ini_set("log_errors", "On");// 设置错误日志文件路径ini_set("error_log", "./error.log");?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>PHP文件上传</title></head><body><form action="" method="post" enctype="multipart/form-data"><fieldset><legend>单文件上传</legend><input type="file" name="file" accept="image/*"><input type="submit" value="上传"></fieldset></form></body></html><?phprequire "./common.php";/*uploadFile()函数参数分别为$_FILES['file'] array文件存放文件夹 string是否检测图片合法性 Boolean支持的图片格式 array图片最大格式'2MB' string*/if(!empty($_FILES['file'])){$res = uploadFile($_FILES['file'],"./static/");echo $res['mess']."<br>";$url = $res['imgurl']??null;echo !empty($url)?"<img src='$url' width='100'>":'';}?>
使用formData上传
var formData = new FormData();formData.append("file", file); //file是blob数据//再用ajax发送formData到服务器即可,注意一定要是post方式上传
使用fileReader读取文件数据进行上传
var fr = new FileReader();fr.readAsDataURL(file);fr.onload = function (event) {//此处获得的data是base64格式的数据var data= event.target.result;img.src = data;ajax(url,{data} ,function(){})}// data可以用来实现图片上传前的本地预览,也可以用来发送base64数据给后端然后返回该数据块对应的地址。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号