引言

一、前端准备

<form action="upload.php" method="post" enctype="multipart/form-data">
    <label for="image">选择图片文件:</label>
    <input type="file" name="image" id="image" required>
    <input type="submit" value="上传图片">
</form>

这里,enctype="multipart/form-data" 是非常重要的,它允许表单数据以二进制形式发送,这对于文件上传是必需的。

二、后端处理

1. 验证图片文件

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $image = $_FILES['image'];
    $imageType = mime_content_type($image['tmp_name']);

    if ($imageType === 'image/jpeg' || $imageType === 'image/png' || $imageType === 'image/gif') {
        // 文件是图片
    } else {
        // 文件不是图片
        die('只能上传图片文件。');
    }
}

2. 保存图片

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // ... 图片验证代码 ...

    $uploadDir = 'uploads/';
    $uploadPath = $uploadDir . basename($image['name']);

    if (move_uploaded_file($image['tmp_name'], $uploadPath)) {
        echo "文件已成功上传到: " . $uploadPath;
    } else {
        echo "文件上传失败。";
    }
}

确保uploads/目录存在,并且网站有权限写入该目录。

3. 处理图片大小和格式

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // ... 图片验证和保存代码 ...

    $imageTypes = ['image/jpeg', 'image/png', 'image/gif'];
    $newWidth = 500;
    $newHeight = 500;

    switch ($imageType) {
        case 'image/jpeg':
            $srcImage = imagecreatefromjpeg($image['tmp_name']);
            break;
        case 'image/png':
            $srcImage = imagecreatefrompng($image['tmp_name']);
            break;
        case 'image/gif':
            $srcImage = imagecreatefromgif($image['tmp_name']);
            break;
    }

    $dstImage = imagecreatetruecolor($newWidth, $newHeight);
    imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $newWidth, $newHeight, imagesx($srcImage), imagesy($srcImage));

    if (in_array($imageType, $imageTypes)) {
        imagejpeg($dstImage, $uploadPath);
    }
}

三、安全性考虑

  • 验证文件类型,避免上传恶意文件。
  • 使用move_uploaded_file()函数来移动文件,它检查文件是否确实是通过POST上传的。
  • 设置合适的文件名,避免路径遍历攻击。
  • 对上传的文件进行大小,避免服务器资源被耗尽。

四、总结