PHP:将 Blob 转换为图像文件

14

使用PHP和MySQL数据库是否可以将blob转换为图像文件?


1
请添加更多细节。BLOB字段包含什么?您计划做什么? - Pekka
1
如果它是作为BLOB存储的图像,则是。 - Mitch Wheat
你尝试设置头部再读取这个二进制大对象了吗? - k102
如果blob包含图像的二进制数据,那么你所问的只是将数据放入具有正确文件扩展名的文件中,或者将内容回显到页面并指示图像格式的头信息的问题。 - Hubro
我只是计划将一个二进制大对象转换为图像文件... - josh
然而,我想使用 PHP 将其保存到我的服务器中(可能使用 file_put_contents())。 - josh
4个回答

10

根据您安装的php图像库,可以使用几种不同的方法。以下是一些示例。

请注意,echo <img> 只是我用来在循环遍历MySQL结果资源时显示多个图像的技巧。就像@NAVEED所展示的那样,您也可以通过header()输出。

GD:

$image = imagecreatefromstring($blob); 

ob_start(); //You could also just output the $image via header() and bypass this buffer capture.
imagejpeg($image, null, 80);
$data = ob_get_contents();
ob_end_clean();
echo '<img src="data:image/jpg;base64,' .  base64_encode($data)  . '" />';

ImageMagick(iMagick):

$image = new Imagick();
$image->readimageblob($blob);
echo '<img src="data:image/png;base64,' .  base64_encode($image->getimageblob())  . '" />';

GraphicsMagick(gMagick):

$image = new Gmagick();
$image->readimageblob($blob);
echo '<img src="data:image/png;base64,' .  base64_encode($image->getimageblob())  . '" />';

6
如果BLOB包含图像的二进制数据(以可识别的格式,如tiff、png、jpeg等),请将BLOB的内容写入文件,即可得到一张图片。
在某些奇怪的操作系统上,您需要为输出文件命名相应的扩展名,以便将图像文件识别为图像。

4

在我的情况下,我必须使用base64_decode将blob图像正确转换为文件。

$path = "/tmp/images";
$sql = "SELECT image_name, image_content FROM images";

$result = mysql_query($sql, $db_con);
if (!$result) {
   $message  = 'Invalid query: ' . mysql_error() . "\n";
   $message .= 'Whole query: ' . $sql;
   die($message);
}

while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
   $image = $row["image_contents"];
   $name = $row["image_name"];

   // option 1
   $file = fopen($path."/".$name,"w");
   echo "File name: ".$path."$name\n";
   fwrite($file, base64_decode($image));
   fclose($file);

   // option 2 (oneliner)
   // file_put_contents($path."/".$name, base64_decode($image));
}

1

如果你正在将图片存储在MySql表的Blob字段中,并且想要获取这些图片,那么这篇文章对你来说会很有用:

请看上述文章中的以下部分:

<?php
if(isset($_REQUEST['id']))
{
   // get the file with the id from database
      include "dbconfig.php";
      $dbconn = mysql_connect($dbhost, $dbusr, $dbpass) or die("Error Occurred-".mysql_error());
      mysql_select_db($dbname, $dbconn) or die("Unable to select database");

      $id    = $_ REQUEST ['id'];
      $query = "SELECT `img_name`, `img_type`, `img_size`, `img_data`
                       FROM img_tbl WHERE id = ‘$id’";

      $result = mysql_query($query) or die(mysql_error());
      list($name, $type, $size, $content) = mysql_fetch_array($result);

      header("Content-length: $size");
      header("Content-type: $type");
      print $content;

      mysql_close($dbconn);
}
?>

2
对于任何从此示例复制/粘贴的人,请注意它使用了错误的引号。 - kurdtpage
九年后... "此域名已于2020年3月15日过期,正在等待续订或删除。" - Arnaud
大多数答案都已经过时了,因为 mysql 函数已被弃用,不再包含在 PHP 中。应使用 mysqli 或 PDO 代替。 - user5175034

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接