在PHP中,$_FILES
是一个超全局变量,用于处理通过HTTP POST方法上传的文件。当你通过HTML表单上传文件时,PHP会将文件信息存储在 $_FILES
数组中。
首先,你需要一个HTML表单来上传文件。表单的 enctype
属性必须设置为 multipart/form-data
,以便能够上传文件。
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload File" name="submit">
</form>
在 upload.php
文件中,你可以使用 $_FILES
来处理上传的文件。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 检查是否有文件上传
if (isset($_FILES["fileToUpload"]) && $_FILES["fileToUpload"]["error"] == 0) {
$target_dir = "uploads/"; // 上传文件保存的目录
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
// 检查文件是否已经存在
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
// 检查文件大小(这里限制为5MB)
if ($_FILES["fileToUpload"]["size"] > 5000000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
// 允许上传的文件类型
$allowed_types = array("jpg", "png", "jpeg", "gif");
if (!in_array($imageFileType, $allowed_types)) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
// 检查 $uploadOk 是否为 0,如果是,表示有错误发生
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
} else {
// 如果一切正常,尝试上传文件
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "The file ". basename($_FILES["fileToUpload"]["name"]). " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
} else {
echo "No file uploaded or there was an error during upload.";
}
}
?>
$_FILES
数组的结构$_FILES
数组包含了上传文件的相关信息,具体结构如下:
$_FILES["fileToUpload"]["name"]
:上传文件的原始名称。$_FILES["fileToUpload"]["type"]
:上传文件的MIME类型。$_FILES["fileToUpload"]["size"]
:上传文件的大小(以字节为单位)。$_FILES["fileToUpload"]["tmp_name"]
:上传文件在服务器上的临时文件名。$_FILES["fileToUpload"]["error"]
:上传文件的错误代码。如果为0,表示没有错误。$_FILES["fileToUpload"]["error"]
可能的值:
UPLOAD_ERR_OK
(0):没有错误,文件上传成功。UPLOAD_ERR_INI_SIZE
(1):上传的文件超过了 php.ini
中 upload_max_filesize
指令限制的大小。UPLOAD_ERR_FORM_SIZE
(2):上传的文件超过了HTML表单中 MAX_FILE_SIZE
指令限制的大小。UPLOAD_ERR_PARTIAL
(3):文件只有部分被上传。UPLOAD_ERR_NO_FILE
(4):没有文件被上传。UPLOAD_ERR_NO_TMP_DIR
(6):找不到临时文件夹。UPLOAD_ERR_CANT_WRITE
(7):文件写入失败。move_uploaded_file()
:将上传的文件从临时位置移动到指定的目录。basename()
:返回路径中的文件名部分,防止路径遍历攻击。pathinfo()
:获取文件路径的信息,如扩展名。通过以上步骤,你可以在PHP中处理文件上传,并确保上传过程的安全性和可靠性。