一、文件上传:
先构造一个html的上传页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form id="upload-form" action="upload.php" method="post" enctype="multipart/form-data" >
<input type="file" id="upload" name="upload" /> <br />
<input type="submit" value="Upload" />
</form>
</body>
</html>
action:是提交给谁处理,写upload.php的话就交由upload.php处理,为空就是自己处理
可以看到页面成功构造成功,接下来了解一下PHP_FILES这个函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form id="upload-form" action="" method="post" enctype="multipart/form-data" >
<!--action:提交给谁处理-->
<input type="file" id="upload" name="upload" /> <br />
<input type="submit" value="Upload" />
</form>
</body>
</html>
<?php
//获取上传文件的名字
$name=$_FILES['upload']['name']; #第一个参数接受的是表单的name
//获取上传文件的类型
$type=$_FILES['upload']['type'];
//获取上传文件的大小
$size=$_FILES['upload']['size'];
//获取上传文件的错误代码
$error=$_FILES['upload']['error'];
//获取上传文件的临时文件名
$tmpname=$_FILES['upload']['tmp_name'];
echo $name."<br>";
echo $type."<br>";
echo $size."<br>";
echo $error."<br>";
echo $tmpname."<br>";
上传一个图片看下效果
接下来熟悉一下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 '文件类型不正确';
}
}
完整代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form id="upload-form" action="" method="post" enctype="multipart/form-data" >
<!--action:提交给谁处理-->
<input type="file" id="upload" name="upload" /> <br />
<input type="submit" value="Upload" />
</form>
</body>
</html>
<?php
//获取上传文件的名字
$name=$_FILES['upload']['name']; #第一个参数接受的是表单的name
//获取上传文件的类型
$type=$_FILES['upload']['type'];
//获取上传文件的错误代码
$size=$_FILES['upload']['size'];
//获取上传文件的错误代码
$error=$_FILES['upload']['error'];
//获取上传文件的临时文件名
$tmpname=$_FILES['upload']['tmp_name'];
echo $name."<br>";
echo $type."<br>";
echo $size."<br>";
echo $error."<br>";
echo $tmpname."<br>";
$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.'<br>'; //将每一个文件名打印出来
}
}
}
看下效果: 可以成功将我们的文件名拿出来
$_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这个函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<h1>直连下载</h1>
<form id="upload-form" action="" method="post" enctype="multipart/form-data" >
<!--action:提交给谁处理-->
<input type="text" name="name" /> <br />
<input type="submit" value="下载" />
</form>
<?php getfilename();?>
<?php $name=$_POST['name'];geturldown($name);?>
<h1>传参下载</h1>
<body>
</body>
</html>
看下效果:可以将文件位置获取到,而下载文件只需要访问这个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");
}
}
单引号的字符串是单纯的字符串
双引号的字符串 里面的变量就是变量的值
输入文件名,下载成功:
完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<?php getfilename();?>
<h1>直连下载</h1>
<form id="upload-form" action="" method="post" enctype="multipart/form-data" >
<!--action:提交给谁处理-->
<input type="text" name="name" /> <br />
<input type="submit" value="下载" />
</form>
<?php $name=$_POST['name'];geturldown($name);?>
<h1>传参下载</h1>
<body>
</body>
</html>
<?php
//获取文件列表
function getfilename(){
$filepath=getcwd(); //获取到当前路径
$filename=scandir($filepath.'/upload/'); //把当前路径下的upload文件夹下的东西都显示出来
foreach ($filename as $value){
if($value != '.' && $value != '..'){
$arr[]=$value;
echo $value.'<br>';
}
}
}
//直连下载函数
function geturldown($name){
$url='http://'.$_SERVER['HTTP_HOST'].'/php-start/file/upload/'.$name;
echo $url;
if($name){
header("location:$url");
}
}
三、文件删除
1、文件删除
2、文件夹删除
unlink()函数:删除文件
rmdir()函数:删除文件夹
直接用这两个函数即可
function delfilename($name){
@unlink($name);
}
function delfiledir($name){
@rmdir($name);
}
还是用之前的代码替换一下函数即可
<h1>文件删除</h1>
<?php getfilename();?>
<form id="upload-form" action="" method="post" enctype="multipart/form-data" >
<!--action:提交给谁处理-->
需要删除的文件<input type="text" name="name" /> <br />
<input type="submit" value="删除" />
</form>
<?php $name=$_POST['name'];delfilename($name);?>
<h1>文件夹删除</h1>
<?php getfilename();?>
<form id="upload-form" action="" method="post" enctype="multipart/form-data" >
<!--action:提交给谁处理-->
需要删除的文件夹<input type="text" name="name" /> <br />
<input type="submit" value="删除" />
</form>
<?php $name=$_POST['name'];delfiledir($name);?>
<body>
</body>
</html>
<?php
function getfilename(){
$filepath=getcwd(); //获取到当前路径
$filename=scandir($filepath); //把当前路径下的东西都显示出来
foreach ($filename as $value){
if($value != '.' && $value != '..'){
$arr[]=$value;
echo $value.'<br>';
}
}
}
function delfilename($name){
@unlink($name);
}
function delfiledir($name){
@rmdir($name);
}
四、文件读取&写入
1)文件读取:
fopen() 函数:打开一个文件或 URL。
如果 fopen() 失败,它将返回 FALSE 并附带错误信息。可以通过在函数名前面添加一个 '@' 来隐藏错误输出。
例子:$file = fopen("test.txt","r");
模式 | 描述 |
---|---|
r | 打开文件为只读。文件指针在文件的开头开始。 |
w | 打开文件为只写。删除文件的内容或创建一个新的文件,如果它不存在。文件指针在文件的开头开始。 |
a | 打开文件为只写。文件中的现有数据会被保留。文件指针在文件结尾开始。创建新的文件,如果文件不存在。 |
x | 创建新文件为只写。返回 FALSE 和错误,如果文件已存在。 |
r+ | 打开文件为读/写、文件指针在文件开头开始。 |
w+ | 打开文件为读/写。删除文件内容或创建新文件,如果它不存在。文件指针在文件开头开始。 |
a+ | 打开文件为读/写。文件中已有的数据会被保留。文件指针在文件结尾开始。创建新文件,如果它不存在。 |
x+ | 创建新文件为读/写。返回 FALSE 和错误,如果文件已存在。 |
fread() 函数读取打开的文件。
fread() 的第一个参数包含待读取文件的文件名,第二个参数规定待读取的最大字节数。
如下 PHP 代码把 "webdictionary.txt" 文件读至结尾:
fread($myfile,filesize(webdictionary.txt));
fclose() 函数用于关闭打开的文件。
function fileread($name){
$myfile = @fopen($name, "r");//打开$name文件
echo @fread($myfile,filesize($name)); //读取到结尾
@fclose($myfile); //关闭
}
可以看到1.txt里面成功读取到123
2)文件写入:
fwrite语法
fwrite(file,string,length)
参数 | 描述 |
---|---|
file | 必需。规定要写入的打开文件。 |
string | 必需。规定要写入打开文件的字符串。 |
length | 可选。规定要写入的最大字节数。 |
修改一下前端
<form id="upload-form" action="" method="post" enctype="multipart/form-data" >
<!--action:提交给谁处理-->
需要写入的文件<input type="text" name="name" /> <br />
需要写入的代码<input type="text" name="txt" /> <br />
<input type="submit" value="写入" />
</form>
<?php $name=$_POST['name'];$txt=$_POST['txt'];filewrite($name,$txt);?>
稍微修改一下之前的代码
function filewrite($name,$txt){
$myfile = @fopen($name, "w+");
@fwrite($myfile,$txt);
@fclose($myfile);
}
写入文件,在用读取文件读一下,成功
完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<h1>文件读取</h1>
<?php getfilename();?>
<form id="upload-form" action="" method="post" enctype="multipart/form-data" >
<!--action:提交给谁处理-->
需要读取的文件<input type="text" name="name" /> <br />
<input type="submit" value="读取" />
</form>
<?php $name=$_POST['name'];fileread($name);?>
<h1>文件写入</h1>
<?php getfilename();?>
<form id="upload-form" action="" method="post" enctype="multipart/form-data" >
<!--action:提交给谁处理-->
需要写入的文件<input type="text" name="name" /> <br />
需要写入的代码<input type="text" name="txt" /> <br />
<input type="submit" value="写入" />
</form>
<?php $name=$_POST['name'];$txt=$_POST['txt'];filewrite($name,$txt);?>
<body>
</body>
</html>
<?php
function getfilename(){
$filepath=getcwd(); //获取到当前路径
$filename=scandir($filepath); //把当前路径下的东西都显示出来
foreach ($filename as $value){
if($value != '.' && $value != '..'){
$arr[]=$value;
echo $value.'<br>';
}
}
}
function fileread($name){
$myfile = @fopen($name, "r");//打开$name文件
echo @fread($myfile,filesize($name));
@fclose($myfile);
}
function filewrite($name,$txt){
$myfile = @fopen($name, "w+");
@fwrite($myfile,$txt);
@fclose($myfile);
}