从MySQL数据库检索图片时出现损坏问题求助(附PHP代码)
我帮你梳理下代码里的几个关键问题,这些都可能导致图片显示损坏:
表单提交判断的笔误:你写的
if(isset($_POST['POST']))肯定不对呀!表单的提交按钮得有对应的name属性(比如你按钮写的是<input type="submit" name="upload" value="上传">),得改成isset($_POST['upload'])才对。这个判断错了的话,要么上传逻辑根本跑不起来,要么误存了错误数据,直接搞坏图片。数据库字段类型不够用:你把base64编码后的图片存在
imaag表的name字段里,base64会让文件体积涨30%左右。如果这个字段是VARCHAR(默认长度大多是255或者1000),绝对会截断图片数据,这是图片损坏的常见原因!
赶紧把name字段改成LONGTEXT类型,保证能装下大体积的base64字符串。图片显示逻辑没写对(核心问题):你显示部分的
echo '...'完全没输出正确的图片格式呀!要显示base64编码的图片,得用data URI格式,正确写法应该是:echo '<img src="data:image/jpeg;base64,' . $row['name'] . '" alt="上传的图片" />';注意这里的
image/jpeg要和你上传的图片类型匹配——要是PNG图就得改成image/png。更稳妥的办法是在数据库里多存一个type字段,记录上传时的$_FILES['image']['type'],显示的时候动态替换:echo '<img src="data:' . $row['type'] . ';base64,' . $row['name'] . '" alt="上传的图片" />';上传时没做错误检查:你压根没判断文件是不是真的上传成功了!比如
$_FILES['image']['error']是不是等于UPLOAD_ERR_OK(也就是0)。如果上传时出了问题(比如文件太大、临时目录写不了),file_get_contents读的就是空文件或者损坏的临时文件,存到数据库里自然也是坏的。
加上这个检查很有必要:if(isset($_POST['upload']) && $_FILES['image']['error'] === UPLOAD_ERR_OK) { // 你的上传逻辑写在这里 }冗余的
addslashes可以删掉:addslashes($_FILES['image']['tmp_name'])和addslashes($_FILES['image']['name'])完全没必要——临时文件路径是系统生成的,不会有SQL注入风险;而且你后面也没用到$image_name变量,直接删了就行。另外,用预处理语句代替直接拼SQL更安全,还能避免转义的麻烦:$stmt = $db->prepare("INSERT INTO imaag (name, type) VALUES (?, ?)"); $stmt->bind_param("ss", $image, $image_type); $image_type = $_FILES['image']['type']; $stmt->execute();
最后给你个测试小技巧:先输出$row['name']的长度,对比上传时base64_encode($image)后的长度,如果不一样,说明数据库字段截断了数据;如果长度一致,那就是显示时的data URI格式写错了。
内容的提问来源于stack exchange,提问作者user8181313

