POST 方法上传
此功能允许用户上传文本和二进制文件。通过 PHP 的身份验证和文件操作功能,您可以完全控制谁可以上传以及上传后如何处理文件。
PHP 能够接收来自任何符合 RFC-1867 的浏览器的文件上传。
注意: 相关配置说明
另请参阅 php.ini 中的 file_uploads、upload_max_filesize、upload_tmp_dir、post_max_size 和 max_input_time 指令。
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");
}
}
?>
可以使用 会话上传进度 实现文件上传进度条。