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

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将PHP数组写入二进制文件,您可以使用PHP函数`pack()`和`fwrite()`。 以下是一个示例代码,它将一个PHP数组写入二进制文件中: ```php // PHP数组 $data = array('apple', 'banana', 'orange'); // 打开二进制文件 $file = fopen('data.bin', 'wb'); // 将数组打包为二进制字符串 $packedData = pack('a*a*a*', ...$data); // 将二进制字符串写入文件 fwrite($file, $packedData); // 关闭文件 fclose($file); ``` 在此示例中,`pack()`函数将数组打包为一个二进制字符串。`'a*'`格式指定将每个字符串作为NULL结尾的字符数组打包,并将它们连接到一起。使用`...`操作符将数组传递给`pack()`函数。 接下来,使用`fwrite()`函数将打包的数据写入二进制文件中。最后,使用`fclose()`函数关闭文件。 您可以使用以下代码读取该二进制文件并将其解包为原始数组: ```php // 打开二进制文件 $file = fopen('data.bin', 'rb'); // 读取文件内容 $packedData = fread($file, filesize('data.bin')); // 解包二进制数据为数组 $data = unpack('a*string1/a*string2/a*string3', $packedData); // 输出解包后的数组 print_r($data); // 关闭文件 fclose($file); ``` 在此示例中,`fread()`函数读取整个二进制文件并将其存储在`$packedData`变量中。 然后,使用`unpack()`函数将二进制数据解包为原始数组。`'a*'`格式指定将每个字符串作为NULL结尾的字符数组解包,并将它们存储在不同的数组键中。 最后,使用`print_r()`函数输出解包后的数组。 希望这可以帮助您将PHP数组写入二进制文件并从中读取数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值