• PHP的高级应用(5)——文件存取

    普通类
    • 支持
    • 批判
    • 提问
    • 解释
    • 补充
    • 删除
    • 默认段落标题(请修改)...

     第三部分:PHP的高级应用

    1.  PHP中的文件及文件存取操作

    PHP中可以直接使用文件存取函数进行文件的读取、存储访问等。此外还可以通过网页表单进行文件上传等操作。下面我们首先来学习fopen()函数。fopen() 函数用于在 PHP 中打开文件,当我们在程序中进行文件的操作中,第一步就是建立文件变量,打开文件,这样才能开始正常的对对应文件进行读取或者存储。fopen函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:

    <html>

    <body>

    <?php

    \$file=fopen("welcome.txt","r");

    ?>

    </body>

    </html>

    文件可能通过下列模式来打开:

    模式

    描述

    r

    只读。在文件的开头开始。

    r+

    /写。在文件的开头开始。

    w

    只写。打开并清空文件的内容;如果文件不存在,则创建新文件。

    w+

    /写。打开并清空文件的内容;如果文件不存在,则创建新文件。

    a

    追加。打开并向文件文件的末端进行写操作,如果文件不存在,则创建新文件。

    a+

    /追加。通过向文件末端写内容,来保持文件内容。

    x

    只写。创建新文件。如果文件已存在,则返回 FALSE

    x+

    /写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。

    注释:如果 fopen() 无法打开指定文件,则返回 0 (false)

    如果 fopen() 不能打开指定的文件,下面的例子会生成一段消息:

    <html>

    <body>

    <?php

    \$file=fopen("welcome.txt","r") or exit("Unable to open file!");

    ?>

    </body>

    </html>

    fclose() 函数用于关闭打开的文件。文件关闭后我们将不能通过文件变量进行读取等操作,但是,当我们不需要进行文件操作时,我们也应但及时关闭该文件,防止读写异常的产生。

    <?php

    \$file = fopen("test.txt","r");

    //some code to be executed

    fclose(\$file);

    ?>

    feof() 函数检测是否已达到文件的末端 (EOF)

    在循环遍历未知长度的数据时,feof() 函数很有用。在 以及 模式,您无法读取打开的文件!

    if (feof(\$file)) echo "End of file";

    fgets() 函数用于从文件中逐行读取文件。在调用该函数之后,文件指针会移动到下一行。

    下面的例子逐行读取文件,直到文件末端为止:

    <?php

    \$file = fopen("welcome.txt", "r") or exit("Unable to open file!");

    //Output a line of the file until the end is reached

    while(!feof(\$file))

    {

    echo fgets(\$file). "<br />";

    }

    fclose(\$file);

    ?>

    fgetc() 函数用于从文件逐字符地读取文件。在调用该函数之后,文件指针会移动到下一个字符。下面的例子逐字符地读取文件,直到文件末端为止:

    <?php

    \$file=fopen("welcome.txt","r") or exit("Unable to open file!");

    while (!feof(\$file))

    {

    echo fgetc(\$file);

    }

    fclose(\$file);

    ?>

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

    创建一个文件上传表单允许用户从表单上传文件是非常有用的。请看下面这个供上传文件的 HTML 表单:

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

    <form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"<input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。

     

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

    这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关什么用户有权上传文件的限制。

    在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb

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

    }

    ?>

    注释:对于 IE,识别 jpg 文件的类型必须是 pjpeg,对于 FireFox,必须是 jpeg

    上面的例子在服务器的 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";

    }

    ?>

    上面的脚本检测了是否已存在此文件,如果不存在,则把文件拷贝到指定的文件夹。这个例子把文件保存到了名为 "upload" 的新文件夹。

     

    • 标签:
    • 打开
    • fopen
    • 文件
    • echo
    • type
    • file
    • 存取
    • php
    • files
    • 函数
    • 高级
    • 应用
    • 上传
  • 加入的知识群:
    学习元评论 (0条)

    评论为空
    聪明如你,不妨在这 发表你的看法与心得 ~



    登录之后可以发表学习元评论
      
暂无内容~~
顶部