POST 方法上传
此功能允许用户上传文本和二进制文件。结合 PHP 的身份验证和文件操作函数,您可以完全控制谁被允许上传以及上传文件后要对其执行的操作。
PHP 能够接收来自任何符合 RFC-1867 的浏览器的文件上传。
注意:相关配置说明
另请参阅 file_uploads、upload_max_filesize、upload_tmp_dir、post_max_size 和 max_input_time 指令,这些指令位于 php.ini 中。
PHP 还支持 Netscape Composer 和 W3C 的 Amaya 客户端使用的 PUT 方法文件上传。有关更多详细信息,请参阅 PUT 方法支持。
示例 #1 文件上传表单
<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
<!-- MAX_FILE_SIZE must precede the file input field -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<!-- Name of input element determines name in $_FILES array -->
Send this file: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
以上示例中的 __URL__
应替换为指向 PHP 文件的 URL。
隐藏字段 MAX_FILE_SIZE
(以字节为单位)必须位于文件输入字段之前,其值是 PHP 接受的最大文件大小。始终应使用此表单元素,因为它可以避免用户在传输大型文件时浪费时间,最终发现文件过大而传输失败。请记住:在浏览器端欺骗此设置非常容易,因此切勿依赖此功能来阻止较大文件。它仅仅是为客户端应用程序的用户提供的一个便利功能。但是,PHP 设置(服务器端)的最大大小无法被欺骗。
注意:
确保您的文件上传表单具有属性 enctype="multipart/form-data"
,否则文件上传将无法正常工作。
全局变量 $_FILES 将包含所有上传的文件信息。来自示例表单的内容如下所示。请注意,这假设使用文件上传名称 userfile,如以上示例脚本中所示。这可以是任何名称。
- $_FILES['userfile']['name']
-
客户端计算机上文件的原始名称。
- $_FILES['userfile']['type']
-
文件的 MIME 类型,如果浏览器提供了此信息。例如 "image/gif"
。但是,此 MIME 类型在 PHP 端未经检查,因此不要将其值视为理所当然。
- $_FILES['userfile']['size']
-
上传文件的大小(以字节为单位)。
- $_FILES['userfile']['tmp_name']
-
上传文件在服务器上存储的临时文件名。
- $_FILES['userfile']['error']
-
与此文件上传关联的 错误代码。
- $_FILES['userfile']['full_path']
-
浏览器提交的完整路径。此值并不总是包含真实的目录结构,并且不可信。从 PHP 8.1.0 开始可用。
默认情况下,文件将存储在服务器的默认临时目录中,除非使用 php.ini 中的 upload_tmp_dir 指令指定了其他位置。可以通过在 PHP 运行的环境中设置环境变量 TMPDIR 来更改服务器的默认目录。在 PHP 脚本中使用 putenv() 设置它将不起作用。此环境变量也可用于确保其他操作也能正常处理上传的文件。
示例 #2 验证文件上传
另请参阅 is_uploaded_file() 和 move_uploaded_file() 函数条目以获取更多信息。以下示例将处理来自表单的文件上传。
<?php
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Possible file upload attack!\n";
}
echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
?>
接收上传文件的 PHP 脚本应实现确定如何处理上传文件所需的任何逻辑。例如,您可以使用 $_FILES['userfile']['size'] 变量丢弃任何过小或过大的文件。您可以使用 $_FILES['userfile']['type'] 变量丢弃任何不符合特定类型标准的文件,但仅将其作为一系列检查中的第一步,因为此值完全受客户端控制,并且在 PHP 端未经检查。此外,您可以使用 $_FILES['userfile']['error'] 并根据 错误代码 计划您的逻辑。无论逻辑如何,您都应从临时目录中删除文件或将其移动到其他位置。
如果在表单中未选择任何文件进行上传,则 PHP 将返回 $_FILES['userfile']['size'] 为 0,并将 $_FILES['userfile']['tmp_name'] 返回为 none。
如果文件未被移走或重命名,则在请求结束时将从临时目录中删除该文件。
示例 #3 上传文件数组
<form action="" method="post" enctype="multipart/form-data">
<p>Pictures:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Send" />
</p>
</form>
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
// basename() may prevent filesystem traversal attacks;
// further validation/sanitation of the filename may be appropriate
$name = basename($_FILES["pictures"]["name"][$key]);
move_uploaded_file($tmp_name, "data/$name");
}
}
?>
可以使用 会话上传进度 实现文件上传进度条。