【问题标题】:Display mutiple images rendering BLOB from mysql in img tag在 img 标记中显示来自 mysql 的多个渲染 BLOB 的图像
【发布时间】:2019-11-08 00:14:29
【问题描述】:

我将图像转换为二进制,并以 BLOB 格式保存在 Mysql 数据库中。 现在,我正在尝试显示所有不同 MIME 类型的图像。 我用不同的建议(stackoverflow)尝试了很多次,也搜索了其他网站。但是,仍然无法显示图像。

为此,我使用了带有 Core PHP (PHP 7.1) 和 MySql 5.6 作为数据库的 LAMP 服务器。 将图像转换为二进制:

function data_uri($file, $mime) 
{  
$contents = file_get_contents($file);
$base64   = base64_encode($contents); 
return ('data:' . $mime . ';base64,' . $base64);
}

将此二进制文件存储在数据库中:

$filename=array("file.jpg","file 22.png","file 11.png","file 1.jpg");
foreach ($filename as $value) {  
$pos = strrpos($value, '.');
$extensions= substr($value, $pos+1);   
if($extensions=='jpg'){
$ext='image/jpg';
$imageData= data_uri('./downloads/'.$value,$ext);
}
if($extensions=='png'){
$ext='image/png'; 
$imageData= data_uri('./downloads/'.$value,$ext);            
}
$sql1="INSERT INTO image(name,binary_image,extension) 
VALUES('".$value."','".$imageData."','".$ext."') ";
$rt=$conn->query($sql1);          
}

在屏幕上显示图像中访问数据库中的数据:

$sql="SELECT * FROM image";
$res=$conn->query($sql);
if($res->num_rows >0){
while($row=$res->fetch_assoc()){
$filenam= $row['name'];
$binaryData= explode(',',$row['binary_image']);
$extens= $row['extension'];
//echo '<img src="data:image/jpeg;base64,'.$binaryData[1].'" alt="photo"> 
<br>';
?>
<img src="<?=$binaryData[0].','. $binaryData[1] ?>" />
<?php  }
}

带有二进制数据的损坏图像

【问题讨论】:

    标签: php mysql image binary blob


    【解决方案1】:

    你需要为每张图片循环:

    <?php
    
    $sql="SELECT * FROM image";
    $res=$conn->query($sql);
    if($res->num_rows >0){
    while($row=$res->fetch_assoc()){
    
        $filenam= $row['name'];
        $binaryData= explode(',',$row['binary_image']);
        $extens= $row['extension'];
    
    
        for ($i = 0; $i < count($binaryData); $i++){
            echo '<img src="data:image/jpeg;base64,'.$binaryData[$i].'" alt="photo"><br>';
        }
    
    
    
        }
    }
    
    ?>
    

    【讨论】:

    • 这里我们使用strlen($binaryData);,那么字符串的长度大约是65513。很抱歉,我没有得到你的答案。
    • 哦,是的,对不起,用 count() 改变
    • 但是在使用 explode --> $binaryData 我们收到了包含 2 个元素的数组。所以,$binaryDatacount 是 2 和 [1]=&gt;'data:image/jpeg;base64,data:image/jpg;base64'[2]=&gt;'BOLB value'
    • 哦,也许我误解了一些东西,我以为你爆炸了 $row['binary_image'] 因为你在这个行字段数据上有超过 1 个图像。如果不是,则不需要添加循环
    • 是的,这就是我所说的。感谢您的建议和回复。 :)
    猜你喜欢
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2014-03-19
    相关资源
    最近更新 更多