1. 前端准备

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="image" />
    <input type="submit" value="上传图片" />
</form>

这里使用了<input type="file">标签来允许用户选择文件,并将表单的enctype属性设置为multipart/form-data,这是上传文件所必需的。

2. 后端处理

2.1 文件类型检查

function isImage($file) {
    $imageInfo = getimagesize($file['tmp_name']);
    return $imageInfo !== false;
}

if (!isImage($_FILES['image'])) {
    die("上传的文件不是图片!");
}

2.2 文件大小

接下来,可以上传文件的大小,以避免服务器资源被过度占用:

$maxFileSize = 2 * 1024 * 1024; // 2MB
if ($_FILES['image']['size'] > $maxFileSize) {
    die("上传的文件过大!");
}

2.3 文件重命名

为了避免文件名冲突,可以将上传的文件重命名为一个唯一的名称。以下是一个简单的重命名方法:

$targetPath = "uploads/" . uniqid() . $_FILES['image']['name'];

2.4 移动文件

最后,将文件从临时目录移动到目标目录:

if (move_uploaded_file($_FILES['image']['tmp_name'], $targetPath)) {
    echo "文件上传成功!";
} else {
    die("文件上传失败!");
}

3. 完整示例

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (!isImage($_FILES['image'])) {
        die("上传的文件不是图片!");
    }
    
    $maxFileSize = 2 * 1024 * 1024; // 2MB
    if ($_FILES['image']['size'] > $maxFileSize) {
        die("上传的文件过大!");
    }
    
    $targetPath = "uploads/" . uniqid() . $_FILES['image']['name'];
    if (move_uploaded_file($_FILES['image']['tmp_name'], $targetPath)) {
        echo "文件上传成功!";
    } else {
        die("文件上传失败!");
    }
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>图片上传</title>
</head>
<body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="image" />
        <input type="submit" value="上传图片" />
    </form>
</body>
</html>

4. 总结