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

从Base64编码字符串生成JPEG图片时遇错误求助

解决JPEG图片解码错误:Unsupported marker type 0x60

我之前处理签名图片存储时也碰到过一模一样的问题,这个报错基本都是因为写入的图片数据格式不对导致的,咱们一步步来排查修复:

最常见的原因:Base64数据包含前缀信息

很多前端(比如Canvas生成签名)传递的Base64字符串会带有类似 data:image/jpeg;base64, 的前缀,如果你直接对整个字符串解码写入文件,就会把非图片的前缀数据也存进去,破坏JPEG的格式结构。

修复代码:移除Base64前缀

修改你的PHP代码,先把前缀去掉再解码:

// 获取前端传递的Base64数据
$base64_raw = $this->input->post('signature_image');

// 移除开头的data URI前缀(兼容JPEG/PNG等格式)
$base64_clean = preg_replace('#^data:image/\w+;base64,#i', '', $base64_raw);

// 生成文件名并写入文件
$signature_image = time() . ".jpg";
$file_path = './uploads/customers/' . $signature_image;

$fp = fopen($file_path, "w");
fwrite($fp, base64_decode($base64_clean));
fclose($fp);

其他可能的排查方向

如果上面的方法没解决,可以试试这几个步骤:

  • 验证Base64数据有效性:开启base64_decode的严格模式,确保数据没有损坏或截断:

    $decoded_data = base64_decode($base64_clean, true);
    if ($decoded_data === false) {
        die('错误:Base64数据无效,请检查前端传递的内容');
    }
    
  • 确认图片实际格式:如果前端生成的是PNG格式的签名(比如Canvas用toDataURL('image/png')),强行存成.jpg也会导致格式错误。此时要么改成存储为.png文件,要么用PHP的GD库转成JPEG:

    // 把PNG数据转成JPEG
    $image = imagecreatefromstring($decoded_data);
    imagejpeg($image, $file_path, 90); // 第三个参数是JPEG质量(0-100)
    imagedestroy($image);
    
  • 检查文件写入完整性:确保./uploads/customers/目录有足够的写入权限,避免文件写入一半就中断导致损坏。可以用is_writable('./uploads/customers/')提前检查权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:33:58