引言

图片上传的基本原理

  1. 客户端选择并提交图片文件。
  2. 服务器接收图片文件。
  3. 服务器存储图片文件。
  4. 图片信息展示。

客户端图片上传

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

这里的enctype="multipart/form-data"是关键,它告诉服务器这是一个包含文件上传的表单。

服务器端接收图片

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['image'])) {
    $image = $_FILES['image'];
    $errors = [];

    // 检查文件是否上传成功
    if ($image['error'] === UPLOAD_ERR_OK) {
        // 检查文件类型
        $fileTypes = ['image/jpeg', 'image/png', 'image/gif'];
        if (!in_array($image['type'], $fileTypes)) {
            $errors[] = '不支持的文件类型。';
        }

        // 检查文件大小
        $maxFileSize = 2 * 1024 * 1024; // 2MB
        if ($image['size'] > $maxFileSize) {
            $errors[] = '文件大小超过。';
        }

        // 移动文件到服务器
        $uploadPath = 'uploads/' . basename($image['name']);
        if (move_uploaded_file($image['tmp_name'], $uploadPath)) {
            echo "文件上传成功。";
        } else {
            $errors[] = '文件上传失败。';
        }
    } else {
        $errors[] = '文件上传出错。';
    }

    // 输出错误信息
    if (!empty($errors)) {
        foreach ($errors as $error) {
            echo $error . '<br>';
        }
    }
}
?>

在上面的代码中,我们首先检查是否是POST请求并且文件是否成功上传。接着,我们检查文件类型和大小,然后将其移动到服务器上的指定目录。

服务器端存储图片

图片信息展示

<?php
if (file_exists('uploads/' . $image['name'])) {
    echo '<img src="uploads/' . htmlspecialchars($image['name']) . '" alt="上传的图片">';
}
?>

这里使用了htmlspecialchars函数来防止跨站脚本攻击(XSS)。

安全注意事项

  1. 文件类型检查:确保只允许上传指定的文件类型,如上例中的JPEG、PNG和GIF。
  2. 文件大小:上传文件的大小,以防止服务器资源被滥用。
  3. 文件名处理:不要直接使用用户上传的文件名,以免目录遍历攻击。在上面的代码中,我们使用basename函数来获取文件名。
  4. 错误处理:妥善处理上传过程中的错误,并给出有用的反馈。

总结