您现在的位置是:首页 > 技术教程 正文

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

admin 阅读: 2024-03-17
后台-插件-广告管理-内容页头部广告(手机)

一、文件上传:

先构造一个html的上传页面

  1. html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>文件上传title>
  6. head>
  7. <body>
  8. <form id="upload-form" action="upload.php" method="post" enctype="multipart/form-data" >
  9. <input type="file" id="upload" name="upload" /> <br />
  10. <input type="submit" value="Upload" />
  11. form>
  12. body>
  13. html>

action:是提交给谁处理,写upload.php的话就交由upload.php处理,为空就是自己处理

 可以看到页面成功构造成功,接下来了解一下PHP_FILES这个函数

  1. "en">
  2. "UTF-8">
  3. 文件上传
  4. "upload-form" action="" method="post" enctype="multipart/form-data" >
  5. "file" id="upload" name="upload" />
  6. "submit" value="Upload" />
  7. <?php
  8. //获取上传文件的名字
  9. $name=$_FILES['upload']['name']; #第一个参数接受的是表单的name
  10. //获取上传文件的类型
  11. $type=$_FILES['upload']['type'];
  12. //获取上传文件的大小
  13. $size=$_FILES['upload']['size'];
  14. //获取上传文件的错误代码
  15. $error=$_FILES['upload']['error'];
  16. //获取上传文件的临时文件名
  17. $tmpname=$_FILES['upload']['tmp_name'];
  18. echo $name."
    "
    ;
  19. echo $type."
    "
    ;
  20. echo $size."
    "
    ;
  21. echo $error."
    "
    ;
  22. echo $tmpname."
    "
    ;

上传一个图片看下效果

接下来熟悉一下move_uploaded_file() 函数

move_uploaded_file() 函数把上传的文件移动到新位置。

如果成功该函数返回 TRUE,如果失败则返回 FALSE

语法

move_uploaded_file(file,newloc)

file必需。规定要移动的文件。
newloc必需。规定文件的新位置。

在当前文件目录下有一个upload文件夹,把接收的文件移动到upload目录下,$name是获取的文件名字

  1. if(!move_uploaded_file($tmpname,'upload/'.$name)){
  2. echo '文件移动失败';
  3. }
  4. else{
  5. echo '文件上传成功';
  6. echo '/upload/'.$name;
  7. }

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

简单的进行一个判断是否是png的类型

  1. if($type=='image/png'){
  2. if(!move_uploaded_file($tmpname,'upload/'.$name)){
  3. echo '文件移动失败';
  4. }
  5. else{
  6. echo '文件上传成功';
  7. echo '/upload/'.$name;
  8. }
  9. }
  10. else{
  11. echo '文件类型不正确';
  12. }

过滤更多后缀

explode()函数:使用一个字符串分割另一个字符串,并返回由字符串组成的数组。

  1. $name='shell.php';
  2. $Filenames = explode(".",$name);
  3. var_dump($Filenames);

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

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

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

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

  1. $allowType = array("jpg", "png", "gif", "jpeg", "ico","zip");//允许的文件拓展名
  2. $Filenames = explode(".",$name); // 使用.分割$name
  3. $Filenamelast=array_pop($Filenames); // 取出数组的最后一个单元,也就是拿到后缀
  4. if($Filenamelast){ //判断是否上传了文件
  5. if(in_array($Filenamelast,$allowType)){ //判断是否在这个数组里面
  6. if(!move_uploaded_file($tmpname,'upload/'.$name)){
  7. echo '文件移动失败';
  8. }
  9. else{
  10. echo '文件上传成功';
  11. echo '/upload/'.$name;
  12. }
  13. }
  14. else{
  15. echo '文件类型不正确';
  16. }
  17. }

完整代码:

  1. "en">
  2. "UTF-8">
  3. 文件上传
  4. "upload-form" action="" method="post" enctype="multipart/form-data" >
  5. "file" id="upload" name="upload" />
  6. "submit" value="Upload" />
  7. <?php
  8. //获取上传文件的名字
  9. $name=$_FILES['upload']['name']; #第一个参数接受的是表单的name
  10. //获取上传文件的类型
  11. $type=$_FILES['upload']['type'];
  12. //获取上传文件的错误代码
  13. $size=$_FILES['upload']['size'];
  14. //获取上传文件的错误代码
  15. $error=$_FILES['upload']['error'];
  16. //获取上传文件的临时文件名
  17. $tmpname=$_FILES['upload']['tmp_name'];
  18. echo $name."
    "
    ;
  19. echo $type."
    "
    ;
  20. echo $size."
    "
    ;
  21. echo $error."
    "
    ;
  22. echo $tmpname."
    "
    ;
  23. $allowType = array("jpg", "png", "gif", "jpeg", "ico","zip");//允许的文件拓展名
  24. $Filenames = explode(".",$name); // 使用.分割$name
  25. $Filenamelast=array_pop($Filenames); // 取出数组的最后一个单元,也就是拿到后缀
  26. if($Filenamelast){ //判断是否上传了文件
  27. if(in_array($Filenamelast,$allowType)){ //判断是否在这个数组里面
  28. if(!move_uploaded_file($tmpname,'upload/'.$name)){
  29. echo '文件移动失败';
  30. }
  31. else{
  32. echo '文件上传成功';
  33. echo '/upload/'.$name;
  34. }
  35. }
  36. else{
  37. echo '文件类型不正确';
  38. }
  39. }

二、文件下载

文件下载分两种

直连下载:http://www.xxx.com/soft/软件.zip

参数下载:http://www.xxx.com/soft/down.php?filename=软件.zip

getchwd() 函数返回当前工作目录

scandir()  函数返回指定目录中的文件和目录的数组

  1. function getfilename(){ //定义一个函数,将文件名拿出来
  2. $filepath=getcwd(); //获取到当前路径
  3. var_dump($filepath);
  4. $filename=scandir($filepath.'/soft/'); //把当前路径下的soft文件夹下的东西都显示出来
  5. var_dump($filename);
  6. }
  7. getfilename();

看下效果:

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

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

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

$_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)

定义一个函数,根据传进来的文件名能访问到它

  1. function geturldown($name){
  2. $url='http://'.$_SERVER['HTTP_HOST'].'/php-start/file/soft/'.$name;
  3. echo $url;
  4. }

可以看到正常无参调用是这样的,如果传进参数就构成完整的url地址了 

修改一下之前的表单信息:接收前端输入的数据并调用geturldown这个函数

  1. html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>文件下载title>
  6. head>
  7. <h1>直连下载h1>
  8. <form id="upload-form" action="" method="post" enctype="multipart/form-data" >
  9. <input type="text" name="name" /> <br />
  10. <input type="submit" value="下载" />
  11. form>
  12. <?php getfilename();?>
  13. <?php $name=$_POST['name'];geturldown($name);?>
  14. <h1>传参下载h1>
  15. <body>
  16. body>
  17. html>

看下效果:可以将文件位置获取到,而下载文件只需要访问这个url就可以

PHP中header:可以用作重定向,有很多操作,下面利用重定向url地址,达到下载文件效果

PHP中header函数的用法及其注意事项详解_php实例_脚本之家 (jb51.net)

header重定向:

header(‘Location: http://www.phpthinking.com');

修改一下之前的代码,重定向一下

  1. function geturldown($name){
  2. $url='http://'.$_SERVER['HTTP_HOST'].'/php-start/file/soft/'.$name;
  3. echo $url;
  4. if($name){ //判断一下是否有传进来的参数,在决定跳转下载
  5. header("location:$url");
  6. }
  7. }

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

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

输入文件名,下载成功:

 完整代码

  1. "en">
  2. "UTF-8">
  3. 文件下载
  4. <?php getfilename();?>
  5. 直连下载

  6. "upload-form" action="" method="post" enctype="multipart/form-data" >
  7. "text" name="name" />
  8. "submit" value="下载" />
  9. <?php $name=$_POST['name'];geturldown($name);?>
  10. 传参下载

  11. <?php
  12. //获取文件列表
  13. function getfilename(){
  14. $filepath=getcwd(); //获取到当前路径
  15. $filename=scandir($filepath.'/upload/'); //把当前路径下的upload文件夹下的东西都显示出来
  16. foreach ($filename as $value){
  17. if($value != '.' && $value != '..'){
  18. $arr[]=$value;
  19. echo $value.'
    '
    ;
  20. }
  21. }
  22. }
  23. //直连下载函数
  24. function geturldown($name){
  25. $url='http://'.$_SERVER['HTTP_HOST'].'/php-start/file/upload/'.$name;
  26. echo $url;
  27. if($name){
  28. header("location:$url");
  29. }
  30. }

三、文件删除

1、文件删除

2、文件夹删除

unlink()函数:删除文件

rmdir()函数:删除文件夹

直接用这两个函数即可

  1. function delfilename($name){
  2. @unlink($name);
  3. }
  4. function delfiledir($name){
  5. @rmdir($name);
  6. }

还是用之前的代码替换一下函数即可

  1. 文件删除

  2. <?php getfilename();?>
  3. "upload-form" action="" method="post" enctype="multipart/form-data" >
  4. 需要删除的文件"text" name="name" />
  5. "submit" value="删除" />
  6. <?php $name=$_POST['name'];delfilename($name);?>
  7. 文件夹删除

  8. <?php getfilename();?>
  9. "upload-form" action="" method="post" enctype="multipart/form-data" >
  10. 需要删除的文件夹"text" name="name" />
  11. "submit" value="删除" />
  12. <?php $name=$_POST['name'];delfiledir($name);?>
  13. <?php
  14. function getfilename(){
  15. $filepath=getcwd(); //获取到当前路径
  16. $filename=scandir($filepath); //把当前路径下的东西都显示出来
  17. foreach ($filename as $value){
  18. if($value != '.' && $value != '..'){
  19. $arr[]=$value;
  20. echo $value.'
    '
    ;
  21. }
  22. }
  23. }
  24. function delfilename($name){
  25. @unlink($name);
  26. }
  27. function delfiledir($name){
  28. @rmdir($name);
  29. }

四、文件读取&写入

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() 函数用于关闭打开的文件。

  1. function fileread($name){
  2. $myfile = @fopen($name, "r");//打开$name文件
  3. echo @fread($myfile,filesize($name)); //读取到结尾
  4. @fclose($myfile); //关闭
  5. }

可以看到1.txt里面成功读取到123 

2)文件写入:

fwrite语法

fwrite(file,string,length)

参数描述
file必需。规定要写入的打开文件。
string必需。规定要写入打开文件的字符串。
length可选。规定要写入的最大字节数。

修改一下前端

  1. <form id="upload-form" action="" method="post" enctype="multipart/form-data" >
  2. 需要写入的文件<input type="text" name="name" /> <br />
  3. 需要写入的代码<input type="text" name="txt" /> <br />
  4. <input type="submit" value="写入" />
  5. form>
  6. <?php $name=$_POST['name'];$txt=$_POST['txt'];filewrite($name,$txt);?>

稍微修改一下之前的代码

  1. function filewrite($name,$txt){
  2. $myfile = @fopen($name, "w+");
  3. @fwrite($myfile,$txt);
  4. @fclose($myfile);
  5. }

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

 

完整代码

  1. "en">
  2. "UTF-8">
  3. 文件下载
  4. 文件读取

  5. <?php getfilename();?>
  6. "upload-form" action="" method="post" enctype="multipart/form-data" >
  7. 需要读取的文件"text" name="name" />
  8. "submit" value="读取" />
  9. <?php $name=$_POST['name'];fileread($name);?>
  10. 文件写入

  11. <?php getfilename();?>
  12. "upload-form" action="" method="post" enctype="multipart/form-data" >
  13. 需要写入的文件"text" name="name" />
  14. 需要写入的代码"text" name="txt" />
  15. "submit" value="写入" />
  16. <?php $name=$_POST['name'];$txt=$_POST['txt'];filewrite($name,$txt);?>
  17. <?php
  18. function getfilename(){
  19. $filepath=getcwd(); //获取到当前路径
  20. $filename=scandir($filepath); //把当前路径下的东西都显示出来
  21. foreach ($filename as $value){
  22. if($value != '.' && $value != '..'){
  23. $arr[]=$value;
  24. echo $value.'
    '
    ;
  25. }
  26. }
  27. }
  28. function fileread($name){
  29. $myfile = @fopen($name, "r");//打开$name文件
  30. echo @fread($myfile,filesize($name));
  31. @fclose($myfile);
  32. }
  33. function filewrite($name,$txt){
  34. $myfile = @fopen($name, "w+");
  35. @fwrite($myfile,$txt);
  36. @fclose($myfile);
  37. }

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜