php实现图片压缩上传

2024-04-16  本文已影响0人  知码客

在PHP中实现图片压缩上传通常涉及几个步骤:接收上传的文件、处理图片(如压缩、调整大小等)、保存处理后的图片到服务器。以下是一个简单的示例,展示如何使用PHP GD库来压缩并上传图片:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['image'])) {
    $targetDir = 'uploads/'; // 图片上传目录
    $targetFile = $targetDir . basename($_FILES['image']['name']);
    $imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
    $maxSize = 1000000; // 限制文件大小,例如1MB
    $uploadOk = 1;
    $imageQuality = 70; // 压缩质量,范围从0(最差质量,文件最小)到100(最佳质量,文件最大)

    // 检查文件大小
    if ($_FILES['image']['size'] > $maxSize) {
        echo "对不起,您的文件过大。";
        $uploadOk = 0;
    }

    // 允许某些文件格式
    $allowedTypes = array('jpg', 'jpeg', 'png', 'gif');
    if (!in_array($imageFileType, $allowedTypes)) {
        echo "对不起,只接受 JPG, JPEG, PNG & GIF 文件。";
        $uploadOk = 0;
    }

    // 检查文件是否已经存在
    if (file_exists($targetFile)) {
        echo "对不起,文件已存在。";
        $uploadOk = 0;
    }

    // 检查 $uploadOk 是否为0,如果没有则尝试上传文件
    if ($uploadOk == 0) {
        echo "对不起,您的文件上传失败。";
    } else {
        if (move_uploaded_file($_FILES['image']['tmp_name'], $targetFile)) {
            echo "文件 ". basename( $_FILES['image']['name']). " 已经上传。";

            // 压缩图片
            $sourceImage = imagecreatefromstring(file_get_contents($targetFile));
            $targetImage = imagecreatetruecolor(imagesx($sourceImage), imagesy($sourceImage));

            imagecopy($targetImage, $sourceImage, 0, 0, 0, 0, imagesx($sourceImage), imagesy($sourceImage));

            // 使用imagejpeg, imagepng或imagegif保存压缩后的图片,取决于原始图片格式
            switch ($imageFileType) {
                case 'jpg':
                case 'jpeg':
                    imagejpeg($targetImage, $targetFile, $imageQuality);
                    break;
                case 'png':
                    imagepng($targetImage, $targetFile, $imageQuality / 10); // 注意:PNG使用不同的质量范围
                    break;
                case 'gif':
                    imagegif($targetImage, $targetFile);
                    break;
                default:
                    echo '不支持的图片格式';
                    break;
            }

            // 释放内存
            imagedestroy($sourceImage);
            imagedestroy($targetImage);

        } else {
            echo "对不起,上传您的文件时出现了错误。";
        }
    }
}
?>

<!-- HTML表单用于上传图片 -->
<form action="" method="post" enctype="multipart/form-data">
    选择图片上传:
    <input type="file" name="image" id="image">
    <input type="submit" value="上传图片" name="submit">
</form>

请注意,上面的代码示例中的$targetDir变量应该指向一个服务器上存在的、可写的目录,用于保存上传的图片。

代码首先检查上传的文件大小是否超过限制,然后检查文件类型是否允许,接着检查文件是否已经存在。如果所有检查都通过,代码将尝试将文件移动到目标目录。然后,它使用GD库来创建图片资源,并复制原始图片的内容到一个新的图片资源中。之后,根据原始图片的文件类型,使用相应的函数(imagejpeg, imagepng, imagegif)保存压缩后的图片。最后,释放用于处理图片的内存。

请注意,使用GD库进行图片压缩可能会导致图片质量的损失,尤其是当压缩质量设置得较低时。此外,这个示例没有包括错误处理和安全性检查(如检查上传文件的内容是否真的是图片),这在实际应用中是非常重要的。在生产环境中,务必增加这些额外的检查以确保系统的健壮性和安全性。

上一篇 下一篇

猜你喜欢

热点阅读