如何将图片以BLOB格式而非文件路径存入数据库(同ID下)
解决将图片内容以BLOB格式存入数据库的问题
你猜的没错!问题确实出在你用了$_FILES['image1']['tmp_name']——这个值只是服务器上临时文件的路径,而不是图片文件的二进制内容。要把图片以BLOB格式存入数据库,你需要读取这个临时文件里的实际数据,而不是存路径。
需要修改的几个关键点:
- 不需要执行
move_uploaded_file(除非你同时需要把图片保存到服务器文件系统),我们要的是文件内容,不是移动后的路径 - 使用
file_get_contents()函数读取临时文件的二进制数据,这才是要存入BLOB字段的内容 - 确保数据库里的
image1-image4字段类型是BLOB(比如MEDIUMBLOB,根据图片大小选择合适的类型)
修改后的代码示例
替换你原来的循环和变量赋值部分:
$prijs = $_POST['prijs']; $naam = $_POST['fname']; $beschrijving = $_POST['desc']; $maat1 = $_POST['maat1']; $maat2 = $_POST['maat2']; $maat3 = $_POST['maat3']; $maat4 = $_POST['maat4']; $aMyUploads = array(); foreach ($_FILES as $aFile) { if(0 === $aFile['error']){ // 读取临时文件的二进制内容,而不是存路径 $fileContent = file_get_contents($aFile['tmp_name']); $aMyUploads[] = $fileContent ?: ''; } else { $aMyUploads[] = ''; } } $stmt = $conn->prepare("INSERT INTO `producten` (naam, beschrijving, prijs, maat1, maat2, maat3, maat4, image1, image2, image3, image4) VALUES (:naam, :beschrijving, :prijs, :maat1, :maat2, :maat3, :maat4, :image1, :image2, :image3, :image4)"); $stmt->execute(array(":naam"=>$naam, ":beschrijving"=>$beschrijving, ":prijs"=>$prijs, ":maat1"=>$maat1, ":maat2"=>$maat2, ":maat3"=>$maat3, ":maat4"=>$maat4, ":image1"=>$aMyUploads[0], ":image2"=>$aMyUploads[1], ":image3"=>$aMyUploads[2], ":image4"=>$aMyUploads[3]));
额外提醒
- 如果图片比较大,建议把数据库字段类型设为
MEDIUMBLOB或LONGBLOB,避免内容被截断 - 存BLOB到数据库虽然可行,但通常更推荐的做法是把图片保存到服务器文件系统,只在数据库里存文件路径——这样数据库体积不会过大,读取效率也更高,你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者thomascoolminecraftplayer555




