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