PHP 文件上传


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

创建PHP文件上传表单

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
&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来访问上传的文件:

1
$_FILES['pictureFile']

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

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

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

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

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

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

整合到一起

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

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

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 显示文件上传表单
*/
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()函数显示上传的文件,否则,将显示错误消息。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?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/的文件夹,并使其可写。


原文链接:https://codingdict.com/