php实现上传图片
使用PHP实现图片上传功能
创建HTML表单
在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的文件,用于处理上传逻辑。

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["image"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
// 检查是否为真实图片
$check = getimagesize($_FILES["image"]["tmp_name"]);
if ($check === false) {
echo "文件不是图片。";
$uploadOk = 0;
}
// 检查文件是否已存在
if (file_exists($targetFile)) {
echo "文件已存在。";
$uploadOk = 0;
}
// 限制文件大小(例如2MB)
if ($_FILES["image"]["size"] > 2000000) {
echo "文件太大。";
$uploadOk = 0;
}
// 允许特定格式
$allowedTypes = ["jpg", "jpeg", "png", "gif"];
if (!in_array($imageFileType, $allowedTypes)) {
echo "仅支持JPG, JPEG, PNG和GIF格式。";
$uploadOk = 0;
}
// 检查上传标志
if ($uploadOk == 0) {
echo "文件未上传。";
} else {
if (move_uploaded_file($_FILES["image"]["tmp_name"], $targetFile)) {
echo "文件" . htmlspecialchars(basename($_FILES["image"]["name"])) . "上传成功。";
} else {
echo "上传过程中出现错误。";
}
}
}
?>
创建上传目录
确保在脚本所在目录下创建一个名为uploads的文件夹,并设置适当的权限(通常为755或777,具体取决于服务器配置)。

安全注意事项
- 验证文件类型时不要仅依赖文件扩展名,应结合
getimagesize()函数检查。 - 可以为上传的文件生成唯一名称,避免文件名冲突和安全问题。
- 限制上传文件的大小,防止服务器资源被耗尽。
- 考虑将上传目录设置为不可执行,防止恶意文件被执行。
生成唯一文件名
改进上传逻辑,为文件生成唯一名称:
$targetFile = $targetDir . uniqid() . '.' . $imageFileType;
完整示例代码
结合上述改进的完整示例:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$targetDir = "uploads/";
if (!file_exists($targetDir)) {
mkdir($targetDir, 0755, true);
}
$imageFileType = strtolower(pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION));
$targetFile = $targetDir . uniqid() . '.' . $imageFileType;
$check = getimagesize($_FILES["image"]["tmp_name"]);
if ($check === false) {
die("文件不是图片。");
}
if ($_FILES["image"]["size"] > 2000000) {
die("文件太大,最大2MB。");
}
$allowedTypes = ["jpg", "jpeg", "png", "gif"];
if (!in_array($imageFileType, $allowedTypes)) {
die("仅支持JPG, JPEG, PNG和GIF格式。");
}
if (move_uploaded_file($_FILES["image"]["tmp_name"], $targetFile)) {
echo "文件上传成功。";
} else {
echo "上传过程中出现错误。";
}
}
?>






