如何修改PHP代码实现批量压缩多张图片而非单张
多图片批量压缩处理修改方案
修改后的完整代码
HTML表单部分
<form method="post" action="" enctype="multipart/form-data"> <div class="file-upload-wrapper"> <input type="file" name="image" accept="image/*" multiple> </div> <!-- 可选:添加压缩级别自定义输入框 --> <input type="number" name="compression" min="0" max="100" value="60" placeholder="压缩级别(JPG:0-100,PNG:0-9)"> <input type="submit" value="upload" name="submit"> </form>
PHP处理部分
<?php if (isset($_POST['submit'])) { // 确保uploads目录存在,不存在则自动创建 $directory_name = 'uploads/'; if (!is_dir($directory_name)) { mkdir($directory_name, 0755, true); } // 遍历所有上传的文件 $total_files = count($_FILES['image']['name']); for ($i = 0; $i < $total_files; $i++) { $image_name = $_FILES['image']['name'][$i]; $tmp_name = $_FILES['image']['tmp_name'][$i]; $error = $_FILES['image']['error'][$i]; // 跳过上传出错的文件 if ($error !== UPLOAD_ERR_OK) { continue; } // 移动原始文件到uploads目录 $file_name = $directory_name . $image_name; if (move_uploaded_file($tmp_name, $file_name)) { // 生成压缩后的文件名 $compress_file = "og_optimised--" . $image_name; $compressed_img = $directory_name . $compress_file; // 执行压缩 compressImage($file_name, $compressed_img); // 删除原始文件 unlink($file_name); } } } function compressImage($source_image, $compress_image) { $image_info = getimagesize($source_image); // 获取用户提交的压缩级别,做格式适配校验 $compression_level = isset($_POST["compression"]) ? (int)$_POST["compression"] : null; if ($image_info['mime'] == 'image/jpeg') { $source = imagecreatefromjpeg($source_image); // JPG压缩级别限制在0-100,默认60 $level = $compression_level !== null && $compression_level >=0 && $compression_level <=100 ? $compression_level : 60; imagejpeg($source, $compress_image, $level); imagedestroy($source); // 释放内存,避免批量处理时溢出 } elseif ($image_info['mime'] == 'image/png') { $source = imagecreatefrompng($source_image); // PNG压缩级别限制在0-9,默认3 $level = $compression_level !== null && $compression_level >=0 && $compression_level <=9 ? $compression_level : 3; imagepng($source, $compress_image, $level); imagedestroy($source); // 释放内存 } return $compress_image; } ?>
核心修改点
- 多文件遍历逻辑:多文件上传时,
$_FILES['image']的name、tmp_name等字段会变成数组,通过循环逐个处理每个文件。 - 错误过滤:添加上传错误判断,跳过上传失败的文件,避免程序崩溃。
- 目录保障:自动创建uploads目录,防止因目录不存在导致文件移动失败。
- 内存优化:压缩后调用
imagedestroy()释放GD库占用的内存,适配批量处理场景。 - 压缩级别适配:根据图片格式对用户输入的压缩级别做范围校验,确保参数合法。
- 表单修复:修正
accept属性为标准的image/*,同时补充压缩级别输入框,让功能更灵活。
内容的提问来源于stack exchange,提问作者Owen Gaudion
相关产品推荐
相关产品推荐

