PHP文件

132 阅读2分钟

PHP 操作文件

  • PHP 拥有的多种函数可供创建、读取、上传以及编辑文件
  • 请谨慎操作文件!
  • 常见的文件操作错误:
编辑错误的文件
被垃圾数据填满硬盘
意外删除文件内容

1. PHP readfile() 函数

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

2. PHP打开文件 fopen()

  • 打开文件的更好的方法是通过 fopen() 函数。此函数为您提供比 readfile() 函数更多的选项
<?php
fopen() 的第一个参数包含被打开的文件名,
第二个参数规定打开文件的模式

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

?>

3. 读取文件 - fread() 读取打开的文件

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

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

  • 用完文件后把它们全部关闭是一个良好的编程习惯
  • fclose() 需要待关闭文件的名称(或者存有文件名的变量)
<?php
$myfile = fopen("webdictionary.txt", "r");
// some code to be executed....
fclose($myfile);
?>

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

  • 调用 fgets() 函数之后,文件指针会移动到下一行
<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fgets($myfile);
fclose($myfile);
?>

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

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

8. 创建文件 - fopen()

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

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

PHP 文件上传

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

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. 创建上传脚本

  • "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"] - 由文件上传导致的  错误代码

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

?>

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