PHP上传图片同步生成缩略图时文件名不一致报错如何修复?
图片画廊缩略图生成文件名不一致问题修复方案
问题根因
你遇到的文件名不匹配问题,核心是RandomStringGenerator()被多次调用生成了不同的随机串,导致原图存储、数据库写入、缩略图生成三个环节用的文件名不一致,缩略图生成时无法找到对应的原图文件。
修复方案
1. 确保随机文件名仅生成一次、全局复用
修改saveimage.php中UploadIMG方法的逻辑,先把生成的随机串存入临时变量,所有用到文件名的场景都复用这个变量,避免重复调用随机生成函数:
public function UploadIMG() { if (isset($_POST['img_submit'])) { try { $crop = new Crop(); $crop->img_name = $_FILES['image']['name']; $crop->tmp_img_name = $_FILES['image']['tmp_name']; $crop->folder = "../public/assets/img/"; $crop->ext = pathinfo($crop->img_name, PATHINFO_EXTENSION); // 仅调用一次随机函数,生成全局唯一文件名 $random_base = $this->RandomStringGenerator(); $crop->new_name = $random_base . "." . $crop->ext; $this->new_name = $crop->new_name; move_uploaded_file($crop->tmp_img_name, $crop->folder . $crop->new_name); $this->RegisterIntoDatabase(); $crop->RunCrop(); unset($_POST); $this->save_result = 1; return $this->save_result; } catch (\Throwable $th) { // 可在此处添加错误日志打印逻辑,方便后续排查问题 $this->save_result = 2; return $this->save_result; } } }
2. 增加文件校验逻辑,提前排查路径问题
修改cropimage.php中的RunCrop方法,增加文件存在性判断,避免路径配置错误导致的找不到文件问题:
public function RunCrop() { $thumb_folder = "../public/assets/uploadThumb/"; $origin_file_path = $this->folder . $this->new_name; // 提前校验原图是否存在 if (!file_exists($origin_file_path)) { throw new Exception("原图不存在,路径:" . $origin_file_path); } $thumb_file_path = $thumb_folder . $this->new_name; copy($origin_file_path, $thumb_file_path); $this->CropImage($thumb_file_path, 300); }
3. 可选优化项(解决代码隐含问题)
- 原
CropImage方法仅支持JPG格式图片,可补充格式判断逻辑,兼容PNG、GIF等常见图片格式 - 原
RegisterIntoDatabase方法直接拼接SQL存在注入风险,建议改为PDO预处理语句写入数据 - 缩略图文件名可增加
thumb_前缀避免和原图重名,数据库thumb字段单独存储带前缀的文件名,方便后续业务调用
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

