引言

一、PHP图片上传基础知识

1.1 图片上传原理

1.2 PHP上传文件函数

PHP提供了move_uploaded_file()函数用于将上传的文件从临时目录移动到目标目录。该函数确保了文件确实是从HTTP POST请求中上传的,从而防止恶意文件上传。

if (move_uploaded_file($tmp_name, $target_path)) {
    // 文件上传成功
} else {
    // 文件上传失败
}

1.3 文件上传安全注意事项

  • 检查文件类型,确保上传的是图片文件。
  • 设置合适的上传文件大小。
  • 验证文件名,避免文件名注入攻击。
  • 设置目标目录的权限,确保PHP脚本可以写入文件。

二、PHP图片上传实战

2.1 创建上传表单

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

2.2 PHP脚本处理上传

<?php
// 检查是否有文件被上传
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['image'])) {
    $image = $_FILES['image'];
    $tmp_name = $image['tmp_name'];
    $error = $image['error'];
    $name = $image['name'];
    $size = $image['size'];
    $type = $image['type'];

    // 检查上传错误
    if ($error !== UPLOAD_ERR_OK) {
        // 处理错误
    }

    // 检查文件类型
    if ($type !== 'image/jpeg' && $type !== 'image/png' && $type !== 'image/gif') {
        // 处理错误
    }

    // 设置目标路径
    $target_path = "uploads/" . basename($name);

    // 移动上传的文件
    if (move_uploaded_file($tmp_name, $target_path)) {
        // 文件上传成功
    } else {
        // 文件上传失败
    }
}
?>

2.3 保存上传的图片

三、进阶技巧

3.1 生成缩略图

// 生成缩略图
$thumbnail_path = "uploads/thumbnail_" . basename($name);
$thumbnail_size = 150; // 缩略图大小
$image = imagecreatefromjpeg($tmp_name);
$thumbnail = imagecreatetruecolor($thumbnail_size, $thumbnail_size);
imagecopyresized($thumbnail, $image, 0, 0, 0, 0, $thumbnail_size, $thumbnail_size, imagesx($image), imagesy($image));
imagejpeg($thumbnail, $thumbnail_path);

3.2 文件名处理

为了避免文件名注入攻击,建议使用basename()函数获取文件名,并使用uniqid()函数生成唯一的文件名。

$name = uniqid() . "_" . basename($name);

四、总结