PHP(文件上传、下载、删除、读取&写入)

PHP(文件上传、下载、删除、读取&写入)

一、文件上传:

先构造一个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(文件上传、下载、删除、读取&写入)

 可以看到页面成功构造成功,接下来了解一下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>";

上传一个图片看下效果

PHP(文件上传、下载、删除、读取&写入)

接下来熟悉一下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;
}

可以看到文件成功上传到指定位置

PHP(文件上传、下载、删除、读取&写入)

简单的进行一个判断是否是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);

看到结果:可以以  “.” 进行分割,并且是数组

PHP(文件上传、下载、删除、读取&写入)

array_pop()函数:弹出数组最后一个单元

可以看到是可以将后缀成功拿到

PHP(文件上传、下载、删除、读取&写入)

定义一个白名单数组,将上传的文件后缀拿出来判断是否在这个数组里面,操作是否要上传

$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();

看下效果:

PHP(文件上传、下载、删除、读取&写入)

foreach 循环用于迭代一个列表或集合变量的值

function getfilename(){
    $filepath=getcwd();  //获取到当前路径
    $filename=scandir($filepath.'/soft/');  //把当前路径下的soft文件夹下的东西都显示出来
    foreach ($filename as $value){  //将数组里的值遍历出来
        if($value != '.' && $value != '..'){  //判断是否是正常的文件
            $arr[]=$value;   //添加到$arr数组里面
            echo $value.'<br>';  //将每一个文件名打印出来
        }
    }
}

看下效果: 可以成功将我们的文件名拿出来

PHP(文件上传、下载、删除、读取&写入)

$_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地址了 

PHP(文件上传、下载、删除、读取&写入)

修改一下之前的表单信息:接收前端输入的数据并调用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(文件上传、下载、删除、读取&写入)

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");
    }
}

单引号的字符串是单纯的字符串 

双引号的字符串 里面的变量就是变量的值

输入文件名,下载成功:

PHP(文件上传、下载、删除、读取&写入)

 完整代码

<!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 

PHP(文件上传、下载、删除、读取&写入)

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);
}

写入文件,在用读取文件读一下,成功

PHP(文件上传、下载、删除、读取&写入)

 

PHP(文件上传、下载、删除、读取&写入)

完整代码

<!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);
}
                       

点击阅读全文

上一篇 2023年 6月 14日 am10:44
下一篇 2023年 6月 14日 am10:48