php实现图片上传
实现图片上传的基本步骤
创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/*">
<input type="submit" value="上传">
</form>
处理上传的PHP代码
在服务器端创建upload.php文件,使用$_FILES超全局变量处理上传的文件。验证文件类型、大小及错误状态。

<?php
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["image"]["name"]);
$imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
// 检查是否为真实图片
$check = getimagesize($_FILES["image"]["tmp_name"]);
if ($check === false) {
die("文件不是图片。");
}
// 检查文件大小(限制为2MB)
if ($_FILES["image"]["size"] > 2000000) {
die("文件过大,请上传小于2MB的图片。");
}
// 允许特定格式
$allowedTypes = ["jpg", "png", "jpeg", "gif"];
if (!in_array($imageFileType, $allowedTypes)) {
die("仅支持JPG, PNG, JPEG, GIF格式。");
}
// 移动文件到目标目录
if (move_uploaded_file($_FILES["image"]["tmp_name"], $targetFile)) {
echo "图片上传成功。";
} else {
echo "上传失败,请重试。";
}
?>
安全增强措施
对文件名进行重命名以避免冲突或恶意文件覆盖。使用uniqid()生成唯一文件名,并保留原始扩展名。
$newFileName = uniqid() . '.' . $imageFileType;
$targetFile = $targetDir . $newFileName;
添加服务器端MIME类型验证,防止伪装文件上传。

$allowedMimeTypes = ["image/jpeg", "image/png", "image/gif"];
if (!in_array($_FILES["image"]["type"], $allowedMimeTypes)) {
die("无效的图片类型。");
}
错误处理与用户反馈
捕获并处理常见错误代码,提供友好的用户提示。
switch ($_FILES["image"]["error"]) {
case UPLOAD_ERR_INI_SIZE:
die("文件超过服务器限制。");
case UPLOAD_ERR_FORM_SIZE:
die("文件超过表单限制。");
case UPLOAD_ERR_PARTIAL:
die("文件仅部分上传。");
case UPLOAD_ERR_NO_FILE:
die("未选择文件。");
case UPLOAD_ERR_OK:
break;
default:
die("未知错误。");
}
文件存储优化
创建按日期分类的目录结构,便于管理大量上传文件。
$subDir = date("Y/m/d");
if (!is_dir($targetDir . $subDir)) {
mkdir($targetDir . $subDir, 0755, true);
}
$targetFile = $targetDir . $subDir . '/' . $newFileName;





