PHP(文件上传、下载、删除、读取&写入)
一、文件上传:
先构造一个html的上传页面
文件上传
action:是提交给谁处理,写upload.php的话就交由upload.php处理,为空就是自己处理
可以看到页面成功构造成功,接下来了解一下PHP_FILES这个函数
文件上传 ";echo $type."
";echo $size."
";echo $error."
";echo $tmpname."
";
上传一个图片看下效果
接下来熟悉一下move_uploaded_file() 函数
move_uploaded_file() 函数把上传的文件移动到新位置。
如果成功该函数返回 TRUE,如果失败则返回 FALSE
语法
move_uploaded_file(file,newloc)
file | 必需。规定要移动的文件。 |
newloc | 必需。规定文件的新位置。 |
在当前文件目录下有一个upload文件夹,把接收的文件移动到upload目录下,$name是获取的文件名字
if(!move_uploaded_file($tmpname,'upload/'.$name)){ echo '文件移动失败';}else{ echo '文件上传成功'; echo '/upload/'.$name;}
可以看到文件成功上传到指定位置
简单的进行一个判断是否是png的类型
if($type=='image/png'){ if(!move_uploaded_file($tmpname,'upload/'.$name)){ echo '文件移动失败'; } else{ echo '文件上传成功'; echo '/upload/'.$name; }}else{ echo '文件类型不正确';}
过滤更多后缀
explode()函数:使用一个字符串分割另一个字符串,并返回由字符串组成的数组。
$name='shell.php';$Filenames = explode(".",$name);var_dump($Filenames);
看到结果:可以以 “.” 进行分割,并且是数组
array_pop()函数:弹出数组最后一个单元
可以看到是可以将后缀成功拿到
定义一个白名单数组,将上传的文件后缀拿出来判断是否在这个数组里面,操作是否要上传
$allowType = array("jpg", "png", "gif", "jpeg", "ico","zip");//允许的文件拓展名$Filenames = explode(".",$name); // 使用.分割$name$Filenamelast=array_pop($Filenames); // 取出数组的最后一个单元,也就是拿到后缀if($Filenamelast){ //判断是否上传了文件 if(in_array($Filenamelast,$allowType)){ //判断是否在这个数组里面 if(!move_uploaded_file($tmpname,'upload/'.$name)){ echo '文件移动失败'; } else{ echo '文件上传成功'; echo '/upload/'.$name; } } else{ echo '文件类型不正确'; }}
完整代码:
文件上传 ";echo $type."
";echo $size."
";echo $error."
";echo $tmpname."
";$allowType = array("jpg", "png", "gif", "jpeg", "ico","zip");//允许的文件拓展名$Filenames = explode(".",$name); // 使用.分割$name$Filenamelast=array_pop($Filenames); // 取出数组的最后一个单元,也就是拿到后缀if($Filenamelast){ //判断是否上传了文件 if(in_array($Filenamelast,$allowType)){ //判断是否在这个数组里面 if(!move_uploaded_file($tmpname,'upload/'.$name)){ echo '文件移动失败'; } else{ echo '文件上传成功'; echo '/upload/'.$name; } } else{ echo '文件类型不正确'; }}
二、文件下载
文件下载分两种
直连下载:http://www.xxx.com/soft/软件.zip
参数下载:http://www.xxx.com/soft/down.php?filename=软件.zip
getchwd() 函数返回当前工作目录
scandir() 函数返回指定目录中的文件和目录的数组
function getfilename(){ //定义一个函数,将文件名拿出来 $filepath=getcwd(); //获取到当前路径 var_dump($filepath); $filename=scandir($filepath.'/soft/'); //把当前路径下的soft文件夹下的东西都显示出来 var_dump($filename);}getfilename();
看下效果:
foreach 循环用于迭代一个列表或集合变量的值
function getfilename(){ $filepath=getcwd(); //获取到当前路径 $filename=scandir($filepath.'/soft/'); //把当前路径下的soft文件夹下的东西都显示出来 foreach ($filename as $value){ //将数组里的值遍历出来 if($value != '.' && $value != '..'){ //判断是否是正常的文件 $arr[]=$value; //添加到$arr数组里面 echo $value.'
'; //将每一个文件名打印出来 } }}
看下效果: 可以成功将我们的文件名拿出来
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组
我们可以通过这个全局变量拿到一些相关信息
举个简单的例子:http://localhost/aaa/?p=222
结果:
$_SERVER['QUERY_STRING'] = "p=222";
$_SERVER['REQUEST_URI'] = "/aaa/?p=222";
$_SERVER['SCRIPT_NAME'] = "/aaa/index.php";
$_SERVER['PHP_SELF'] = "/aaa/index.php";
$_SERVER['HTTP_HOST'] = "localhost"
更多$_SERVER的使用:$_SERVER参数的含义 (bbsmax.com)
定义一个函数,根据传进来的文件名能访问到它
function geturldown($name){ $url='http://'.$_SERVER['HTTP_HOST'].'/php-start/file/soft/'.$name; echo $url;}
可以看到正常无参调用是这样的,如果传进参数就构成完整的url地址了
修改一下之前的表单信息:接收前端输入的数据并调用geturldown这个函数
文件下载 直连下载
传参下载
看下效果:可以将文件位置获取到,而下载文件只需要访问这个url就可以
PHP中header:可以用作重定向,有很多操作,下面利用重定向url地址,达到下载文件效果
PHP中header函数的用法及其注意事项详解_php实例_脚本之家 (jb51.net)
header重定向:
header(‘Location: http://www.phpthinking.com');
修改一下之前的代码,重定向一下
function geturldown($name){ $url='http://'.$_SERVER['HTTP_HOST'].'/php-start/file/soft/'.$name; echo $url; if($name){ //判断一下是否有传进来的参数,在决定跳转下载 header("location:$url"); }}
单引号的字符串是单纯的字符串
双引号的字符串 里面的变量就是变量的值
输入文件名,下载成功:
完整代码
文件下载 直连下载
传参下载
'; } }}//直连下载函数function geturldown($name){ $url='http://'.$_SERVER['HTTP_HOST'].'/php-start/file/upload/'.$name; echo $url; if($name){ header("location:$url"); }}
三、文件删除
文件删除
文件夹删除
unlink()函数:删除文件
rmdir()函数:删除文件夹
直接用这两个函数即可
function delfilename($name){ @unlink($name);}function delfiledir($name){ @rmdir($name);}
还是用之前的代码替换一下函数即可
文件删除
文件夹删除