You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP图片压缩上传后生成0字节文件的问题求助

问题排查:压缩图片后生成0字节文件的原因及修复

核心问题分析

你的代码生成0字节文件,主要有以下几个关键原因:

  • PNG图片压缩参数错误:imagepng()的quality参数是0-9的压缩级别,而非imagejpeg()的0-100质量值,传入75会导致无效输出。
  • 未检查图片资源创建结果:如果临时文件损坏或格式异常,imagecreatefromxxx()会返回false,后续输出函数无法生成有效文件。
  • 目标目录权限不足:draft/目录需要Web服务器进程具备写入权限,否则无法写入内容。
  • 缺少错误检测机制:没有对压缩过程中的异常进行捕获,无法快速定位问题。

修复后的完整代码

function compressImage($source, $destination, $quality) {
    // 检查源文件是否存在
    if (!file_exists($source)) {
        return false;
    }

    // 获取图片信息
    $imgInfo = getimagesize($source);
    if (!$imgInfo) {
        return false;
    }
    $mime = $imgInfo['mime']; 

    // 创建图片资源
    $image = null;
    $outputSuccess = false;
    switch($mime){ 
        case 'image/jpeg': 
            $image = imagecreatefromjpeg($source);
            // JPEG质量范围0-100
            $outputSuccess = imagejpeg($image, $destination, $quality);
            break; 
        case 'image/png': 
            $image = imagecreatefrompng($source);
            // 将0-100的质量值转换为PNG支持的0-9压缩级别
            $pngQuality = min(max(intval($quality / 11), 0), 9);
            $outputSuccess = imagepng($image, $destination, $pngQuality);
            break; 
        case 'image/gif': 
            $image = imagecreatefromgif($source);
            $outputSuccess = imagegif($image, $destination);
            break; 
        default: 
            return false;
    } 

    // 释放图片资源
    if ($image) {
        imagedestroy($image);
    }

    // 返回是否成功生成有效文件
    return $outputSuccess ? $destination : false;
}


if(isset($_POST['submit'])){
    $conn = $pdo->open();
    $uploadPath = "draft/"; 
    // 确保上传目录存在,不存在则创建并设置权限
    if (!is_dir($uploadPath)) {
        mkdir($uploadPath, 0755, true);
    }

    $uploaded_img = '';
    $allfiles = [];

    if(isset($_FILES['photo']['name'][0]) && $_FILES['photo']['size'][0] != 0 && $_FILES['photo']['error'][0] == 0) 
    {
        $filesCount = count($_FILES['photo']['name']);
        $extensions= array("jpeg","jpg","png");
        
        for($i = 0; $i < $filesCount; $i++) { 
            // 检查单个文件的上传状态
            if ($_FILES['photo']['error'][$i] !== UPLOAD_ERR_OK) {
                $_SESSION['error'] = "第".($i+1)."个文件上传失败";
                continue;
            }

            $ext = strtolower(pathinfo($_FILES['photo']['name'][$i], PATHINFO_EXTENSION));
            if(!in_array($ext,$extensions)){
                $_SESSION['error']  = '扩展名不允许,请选择.jpg、.jpeg或.png文件';
                continue;
            }

            $new_filename = time().$i.'.'.$ext;
            $destination = $uploadPath.$new_filename;
            // 调用压缩函数并验证结果
            if (compressImage($_FILES["photo"]["tmp_name"][$i], $destination, 75)) {
                $allfiles[] = $new_filename;
            } else {
                $_SESSION['error'] = "第".($i+1)."个图片压缩失败";
            }
        }

        if (!empty($allfiles)) {
            $uploaded_img = implode(',',$allfiles);
        }
    }

    try{
        $stmt = $conn->prepare("INSERT INTO marketplace (category_id, post_userid, userid, name, description, slug, price, photo, suburb_province, counter) VALUES (:category, :post_userid, :userid, :name, :description, :slug, :price, :photo, :suburb_province, :counter)");
        $stmt->execute([
            'category'=>$category, 
            'post_userid'=>$post_userid, 
            'userid'=>$userid, 
            'name'=>$name, 
            'description'=>$description, 
            'slug'=>$slug, 
            'price'=>$price, 
            'photo'=>$uploaded_img, 
            'suburb_province'=>$suburb_province, 
            'counter'=>0
        ]);
        $_SESSION['success'] = '商品添加成功';
    }
    catch(PDOException $e){
        $_SESSION['error'] = '数据库操作失败:'.$e->getMessage();
    }

    $pdo->close();
}

关键修复点说明

  1. 修正PNG压缩参数:将传入的0-100质量值转换为PNG支持的0-9压缩级别,避免无效参数导致空文件。
  2. 增加资源有效性检查:在创建图片资源、获取图片信息时添加判断,防止无效资源进入输出流程。
  3. 目录自动创建与权限设置:自动生成不存在的上传目录,并设置Web服务器可写入的权限(0755)。
  4. 单个文件错误处理:针对每个文件的上传状态单独校验,避免单个文件异常影响整体流程。
  5. 压缩结果校验:仅当压缩函数成功生成有效文件时,才将文件名加入记录数组。

内容的提问来源于stack exchange,提问作者Leo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:43:10