PHP 文件上传

时间:2018-11-15 15:11:18  来源:igfitidea点击:

本教程我们将学习如何用PHP将文件上载到web服务器。
我们的例子将把图片上传到web服务器并在网页上显示。

创建PHP文件上传表单

首先,要将文件上传到服务器,需要一个文件上传表单。除了actionmethod属性外,文件上传表单还必须具有enctype属性,其值为multipart/form-data:

<form action="index.php" method="post" enctype="multipart/form-data"></form>

enctype属性允许将表单数据编码为多部分MIME数据,这是将二进制数据上传到web服务器所必需的。

然后,在上传文件表单中,还需要有一个file select的控件,以便用户可以从他们的计算机中选择要上传到服务器的文件。在一个表单中,可以有多个文件选择按钮。

下面的例子将展示了如何创建一个文件选择按钮:

<input type="file" name="pictureFile">

请注意,我们在input元素中使用的是type="file"

所以PHP上传文件到服务器的表单如下:

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;PHP File Upload&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;form action="index.php" method="post" enctype="multipart/form-data"&gt;
 &lt;label for="pictureFile"&gt;Select a picture&lt;/label&gt;
 &lt;input type="file" name="pictureFile"&gt; 
 &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;

PHP如何处理上传文件

可以使用$_FILES超全局数组访问上传文件的信息。

下面的例子展示了如何使用文件字段名pictureFile来访问上传的文件:

$_FILES['pictureFile']

这个数组元素本身也是一个关联数组,它包含了上传文件的各种信息,如下所述:

name:上传文件的名称
type:上传文件的MIME类型,例如:jpeg图像是image/jpeg,pdf文件的是application/pdf。
size:上传文件的大小,以字节为单位
tmp_name:上传文件存储在web服务器的临时文件夹中的完整路径。
error:描述文件上传状态的错误代码,例如UPLOAD_ERR_OK表示文件上传成功。

例如,要访问上传文件的文件名,可以使用以下代码片段:

$filename = $_FILES['pictureFile']['name'];

PHP允许您通过PHP.ini文件中的upload_max_filesize配置限制上传文件的大小。
默认的upload_max_filesize通常是2mb。要上传更大的文件,你需要调整这个配置。

当文件被成功上传到web服务器时,它被存储在一个临时文件夹中。
通常,还需要使用move_uploaded_file()函数将文件从临时文件夹移动到特定文件夹。

整合到一起

下面的示例将完整展示如何将JPEG照片上传到服务器并显示它。

首先,我们创建一个函数来显示文件上传表单:

/**
 *  显示文件上传表单
 */
function display_form(){
 ?>
 <form action="index.php" method="post" enctype="multipart/form-data">
 <label for="pictureFile">Select a picture</label> 
 <input type="file" name="pictureFile"> <br/> 
 <input type="submit" name="submit" value="Upload" />
 </form>
<?php 
}

然后我们创建一个函数来处理上传的文件。

  • 如果表单数据没有提交,我们将在上面显示文件上传表单,以便用户选择要上传的文件。
  • 如果提交了表单数据,我们将检查文件上传中是否发生了错误,并确保上传的文件为JPEG。如果一切正确,我们将上传的文件移动到images/文件夹中,并使用display_picture()函数显示上传的文件,否则,将显示错误消息。

代码如下:

<?php
// 定义存储图片文件的目录
define('PICTURE_FOLDER', 'images/');

/**
 *  显示文件上传表单
 */
function display_form() {
    ?>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <label for="pictureFile">请选择一张图片</label> 
        <input type="file" name="pictureFile"> <br /> 
        <input type="submit" name="submit"value="上传" />
    </form>
    <?php
}

/**
 * 显示由$file参数指定的图片
 * @param string $file 要显示的图片文件
 */
function display_picture($file) {
    echo sprintf('<img src="%s">', $file);
    echo '<br>';
    // 上传表单的链接
    echo sprintf('<a href="index.php">上传另一个文件</a>');
}

/**
 *  处理文件上传
 */
function process_file() {
    if (isset($_POST['submit'])) {
        $error = $_FILES['pictureFile']['error'];

        if (isset($_FILES['pictureFile']) && $error == UPLOAD_ERR_OK) {
            if ($_FILES['pictureFile']['type'] != 'image/jpeg') {
                $new_file = PICTURE_FOLDER . $_FILES['pictureFile']['name'];

                if (move_uploaded_file($_FILES['pictureFile']['tmp_name'], $new_file)) {
                    display_picture($new_file);
                } else {
                    echo '移动文件时出错';
                }
            } else {
                echo '请上传一个JPEG文件';
            }
        } else {
            switch ($error) {
                case UPLOAD_ERR_INI_SIZE:
                    $max_size = ini_get('upload_max_filesize');
                    $err_msg = sprinf('图片文件大于 %f MB 无法上传.', $max_size);
                    break;
                case UPLOAD_ERR_NO_FILE:
                    $err_msg = '没有上传任何文件。请选择要上传的文件';
                    break;
                default:
                    $err_msg = '上传文件时出错';
            }
        }
    } else {
        display_form();
    }
}
?>

<!DOCTYPE html>
<html>
    <head>
        <title>PHP 文件上传</title>
    </head>
    <body>
        <?php
        process_file();
        ?>
    </body>
</html>

此外,我们还需要在web根目录下创建一个名为images/的文件夹,并使其可写。