php之文件

发布时间 2023-10-09 18:22:01作者: songxia777

1 PHP 操作文件

PHP 拥有的多种函数可供创建、读取、上传以及编辑文件;

请谨慎操作文件!;

常见的文件操作错误:

  • 编辑错误的文件
  • 被垃圾数据填满硬盘
  • 意外删除文件内容

1.1 readfile() 函数

readfile() 函数读取文件,并把它写入输出缓冲

image

1.2 打开文件 fopen()

打开文件的更好的方法是通过 fopen() 函数。此函数为您提供比 readfile() 函数更多的选项

<?php
/*
fopen() : 第一个参数包含被打开的文件名,
           第二个参数规定打开文件的模式
*/    

$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fread($myfile,filesize("webdictionary.txt"));
fclose($myfile);

image

1.3 读取文件 - fread() 读取打开的文件

fread() 的第一个参数包含待读取文件的文件名,第二个参数规定待读取的最大字节数

1.4 闭文件 - fclose()用于关闭打开的文件

用完文件后把它们全部关闭是一个良好的编程习惯

fclose() 需要待关闭文件的名称(或者存有文件名的变量)

<?php
$myfile = fopen("webdictionary.txt", "r");
// some code to be executed....
fclose($myfile);

1.5 读取单行文件 - fgets()用于从文件读取单行

调用 fgets() 函数之后,文件指针会移动到下一行

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fgets($myfile);
fclose($myfile);
?>

1.6 检查 End-Of-File - feof() 检查是否已到达 "end-of-file" (EOF)

feof() 对于遍历未知长度的数据很有用

逐行读取 "webdictionary.txt" 文件,直到 end-of-file

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// 输出单行直到 end-of-file
while(!feof($myfile)) {
  echo fgets($myfile) . "<br>";
}
fclose($myfile);
?>

1.7 读取单字符 - fgetc() 用于从文件中读取单个字符

在调用 fgetc() 函数之后,文件指针会移动到下一个字符

逐字符读取 "webdictionary.txt" 文件,直到 end-of-file

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// 输出单字符直到 end-of-file
while(!feof($myfile)) {
  echo fgetc($myfile);
}
fclose($myfile);
?>

1.8 创建文件 - fopen()

  • fopen() 函数也用于创建文件
  • 也许有点混乱,但是在 PHP 中,创建文件所用的函数与打开文件的相同。
  • 如果您用 fopen() 打开并不存在的文件,此函数会创建文件,假定文件被打开为写入(w)或增加(a)。
  • 如果您试图运行这段代码时发生错误,请检查您是否有向硬盘写入信息的 PHP 文件访问权限
$myfile = fopen("testfile.txt", "w")

1.9 写入文件 - fwrite() 用于写入文件

fwrite() 的第一个参数包含要写入的文件的文件名,第二个参数是被写的字符串

<?php
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
$txt = "Bill Gates\n";
fwrite($myfile, $txt); //第一次写入
$txt = "Steve Jobs\n";
fwrite($myfile, $txt); //第二次写入
fclose($myfile);
?>
输出结果:
Bill Gates
Steve Jobs

2 PHP 文件上传

通过 PHP,可以把文件上传到服务器

2.1 创建一个文件上传表单

<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。

<html>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
     <label for="file">Filename:</label>
     <input type="file" name="file" id="file" /> 
     <br />
     <input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>

2.2 创建上传脚本

  • "upload_file.php" 文件含有供上传文件的代码
  • 这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关什么用户有权上传文件的限制
<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br />";
  }
else
  {
  echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  echo "Stored in: " . $_FILES["file"]["tmp_name"];
  }
?>
  • 通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件
  • 第一个参数是表单的 input name
  • 第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。就像这样:
$_FILES["file"]["name"] - 被上传文件的  名称
$_FILES["file"]["type"] - 被上传文件的  类型
$_FILES["file"]["size"] - 被上传文件的  大小,以字节计
$_FILES["file"]["tmp_name"] - 存储在服务器的文件的  临时副本的名称
$_FILES["file"]["error"] - 由文件上传导致的  错误代码

2.3 文件的上传限制

  • 在此,我们使用户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb
  • 对于 IE,识别 jpg 文件的类型必须是 pjpeg,对于 FireFox,必须是 jpeg
<?php

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Error: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Stored in: " . $_FILES["file"]["tmp_name"];
    }
  }
else
  {
  echo "Invalid file";
  }

?>

2.4 保存被上传的文件

  • 上面的例子在服务器的 PHP 临时文件夹创建了一个被上传文件的临时副本
  • 这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置
  • 下面的例子还检测了是否已存在此文件,如果不存在,则把文件拷贝到指定的文件夹
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>