PHP 文件上传
本教程我们将学习如何用PHP将文件上载到web服务器。
我们的例子将把图片上传到web服务器并在网页上显示。
创建PHP文件上传表单
首先,要将文件上传到服务器,需要一个文件上传表单。除了action
和method
属性外,文件上传表单还必须具有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上传文件到服务器的表单如下:
<!DOCTYPE html> <html> <head> <title>PHP File Upload</title> </head> <body> <form action="index.php" method="post" enctype="multipart/form-data"> <label for="pictureFile">Select a picture</label> <input type="file" name="pictureFile"> </form> </body> </html>
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/的文件夹,并使其可写。