请帮助我编写代码。我必须输出一个图像(此图像为PNG),该图像由sql server转换为二进制文件或BLOB。请查看以下代码:
<?php
$myServer = "111.22.33.44";
$myUser = "username";
$myPass = "password";
$myDB = "database";
$connection = sqlsrv_connect($myServer, array('UID'=>$myUser, 'PWD'=>$myPass,
'Database'=>$myDB));
if ($connection === false){
print_r( sqlsrv_errors());
}
$qry_getCategory = "SELECT Sketch FROM Sample_Specs_Comment WHERE StyleID = '1'";
$stmt = sqlsrv_query($connection, $qry_getCategory);
if ($stmt) {
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$imgDes = $row["Sketch"];
echo $imgDes;
} else{
echo "Submission Unsuccessful!";
die(print_r(sqlsrv_error(), true));
}
?>
文本图像文件的数据以0x89504E470开头……我假设这是一种二进制代码或BLOB。这是在数据库的“素描”列中。我想将BLOB输出为可查看的格式,例如“ PNG”或“ JPEG”。
这是下面的输出:
IHDR�Y�"l�sRGB���gAMA���a pHYs���o�d<�IDATx^�}x�vBHH
答案 0 :(得分:0)
我不确定是要返回一个图像还是要在一次请求中从数据库中加载多个图像并显示它们?
假设您说“我必须在页面中输出数据”,我将使用后者。
快速查看它,我发现您可以走两条路线。如果二进制数据是有效的映像,并且您知道类型,则可以将其保存到文件中(也许在临时的ramdisk中,以避免写在磁盘上),然后像平常一样从该文件中读取。我可能不会走这条路线,因为您已经在数据库中保存了二进制数据并将其保存到另一个位置,这表明设计是错误的,更正确的方案是立即将映像保存在磁盘上并存储对在数据库中。
因此,由于二进制数据已经存在于数据库中,因此我将使用 base64 编码将其直接加载到页面的图像标签中。
伪代码类似于
$imageData = getBinaryImageDataFromDb();
$imageData = base64_encode($imageData);
// in html
<img src="data:image/png;base64,<?php echo $imageData?>">
由于您没有从文件中加载数据,因此mime_content_type()等常规功能将无法正常工作,因为文件除外。而且我们不想为此保存临时文件。
因此,要检查文件的文件格式,可以检查起始字节并使用该字节确定图像类型。
JPEG: "\xFF\xD8\xFF"
PNG: "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a"
答案 1 :(得分:0)
我想我已经解决了这个问题。我已经将二进制数据编码为base64。
if ($stmt) {
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$imgDes = $row["Sketch"];
$imageData = base64_encode($imgDes);
}
}
和HTML:
<img src="<?php echo $imageData; ?>" alt="Image"/>
这应该有所帮助。 感谢为问题提供答案的人。