【问题标题】:show image from blob mysql显示来自 blob mysql 的图像
【发布时间】:2009-05-25 16:45:16
【问题描述】:

您好,我的数据库中有一个图像表。它们与图像类型和名称等详细信息一起存储为 blob。

我在显示图像时遇到问题,我得到的只是一个带有红十字的白框。 代码:

<?php

include '../connection.php';

$ID = $_GET['id'];

$query = "SELECT * FROM `images` WHERE `image_id` = '$ID'";

$result=mysql_query($query);
$row = mysql_fetch_array($result);

$image = $row['image'];
$image_type= $row['image_type'];   

header("Content-type: $image_type");
print $image; 

exit;

?>

谢谢

【问题讨论】:

  • 什么存储在 db 中?如何 ?你知道 blob 类型限制为 64k 吗?
  • 实际图像以blob形式存储在数据库中,其余数据为varchar。图像在数据库中显示为 [BLOB - 64.0 KiB]
  • 你的数据库中上传和存储的图片是否小于64K?图像类型是否是正确的 mime 类型,例如 image/png 或 image/jpeg ?
  • 图片不超过64k
  • 更改类型。上传新图像,然后尝试使用它。使用JPG压缩,如果文件不完整,显示时会出错。

标签: php mysql


【解决方案1】:

这里有一个简短的答案。

<?php
include '../connection.php';
$id = (int)$_GET['id'];
$query = "SELECT * FROM `images` WHERE `image_id` = '$id'";

$result=mysql_query($query);
$row = mysql_fetch_array($result);

$image = $row['image'];
$image_type= $row['image_type'];
$size = $row['image_size'];
//alternative
/* list($image, $image_type, $size) = array(
                                       $row['image'],
                                       $row['image_type'],
                                       $row['image_size']
                                      );
*/
$ext = explode('/', $image_type);
$name = $id . '.' . $ext[1]; 

header("Content-type: $image_type");
header("Content-length: $size");
header("Content-Disposition: attachment; filename=$name");

print $image;     
exit;

检查您的 blobtype 是否至少为 MEDIUMBLOB,它能够存储高达 16M 的数据

【讨论】:

  • 我已经添加了它们,并且也将其更改为 MEDIUMBLOB 但仍然相同。
  • Content-Dispostion 标头应仅用于下载。它不应用于发送 标签的图像。
  • 您好,我试过这个...它会尝试下载一个名为 4 的文件
  • 更新 - 在 Firefox 中我收到错误图像 /view_image.php?id=4” 无法显示,因为它包含错误。
  • 我修复了代码中的一些错误。顺便说一句,文件名应该是 4.jpeg 甚至 4.pjpeg 试试看,var_dump($row);看看你从数据库中得到了什么。
【解决方案2】:

要调试它,我建议注释掉 Content-type 标题行,然后直接在浏览器中点击 url。这将允许您查看 PHP 可能发出的任何错误、警告或通知。

【讨论】:

    【解决方案3】:

    尝试几件事

    1. 可能有问题,它在 html 中返回错误消息,而不是预期的图像

    2. 是content_type正确存储在数据库中还是只是存储图片的文件扩展名

    内容类型应该是这样的

    image/gif 
    image/jpeg
    

    【讨论】:

      【解决方案4】:

      这似乎可行,出了什么问题?

      尝试明确指定字段:

       SELECT image, image_type FROM ...
      

      当您从数据库运行查询时会发生什么?

      您是否正在加载图像:

      <img src="image.php?id=12">
      

      或者您是否将 PHP 作为自己的页面加载?

      【讨论】:

      • 我在自己的页面上加载图像,例如 view_image.php?id=2 我没有从查询中得到任何错误,但是在 Firefox 中运行时,我得到了页面中显示的 url。但在 IE 中我得到一个带有红十字的图片框?
      【解决方案5】:

      也许你可以试试

      $row = mysql_fetch_assoc($result);
      

      而不是

      $row = mysql_fetch_array($result);
      

      【讨论】:

      • 我认为默认情况下,mysql_fetch_array 将存储数字和名称,因此 $row[0] 和 $row['columnname'] 都是有效的
      【解决方案6】:

      您在评论中说该表最初显示“[BLOB - 64.0 KiB]”,但您随后将其更改为“MEDIUMBLOB”。这将扩大您可以存储的大小,但您现有的所有数据仍将被截断为 64KiB。

      确保您使用的字段类型足够大以存储您要存储的数据(MEDIUMBLOB 中 16mb 或 LONGBLOB 中约 4gb,我很确定),然后重新插入所有数据。

      除了提到的安全问题,我不明白为什么代码除了数据库问题之外不应该工作。

      【讨论】:

      • 我已完成此操作并重新上传了一张图片,现在显示为 [BLOB - 369.9 KiB]
      • 当您现在访问它时,它是否正确显示在页面上? (使用原始问题中的代码)。我尝试了那个确切的代码,它似乎工作正常(虽然使用 jpeg,而不是 pjpeg)
      【解决方案7】:

      或者如果你不想创建单独的php文件,你可以内联它

      <?php
      // retrieve blob into $img
      ?><img src='data:image/png;base64,<?php echo base64_encode( $img );?>' alt='Image <?php echo $id;?>'>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-31
        • 2014-03-19
        • 1970-01-01
        • 1970-01-01
        • 2014-11-03
        相关资源
        最近更新 更多