【问题标题】:How to display an Image from a mysql blob如何显示来自 mysql blob 的图像
【发布时间】:2009-11-19 03:43:41
【问题描述】:

我正在尝试显示来自 MySQL blob 字段的图像。我尝试了一些不同的东西,但它们似乎都不起作用。

我试过了:

  • header("Content-type: $type"); img src = $blobData;

  • header("Content-type: $type"); echo($blobData);

【问题讨论】:

  • type 的值是什么?如果它是 jpg 你应该有: image/jpg

标签: php mysql blob


【解决方案1】:
<?php
  header("Content-type: $type");
  echo $blobData;
?>

这段代码看起来完全没问题。但是,我从另一个人那里听到了类似的抱怨,我能够通过确保:

  1. php脚本在发送二进制图像数据前后不输出任何多余的字符。

  2. php 脚本保存为纯 ASCII 文本文件,而不是 Unicode/UTF-8 编码文件。 Unicode/UTF-8 编码的 PHP 文件可能包含一个签名作为第一个字节。这些字节在您的文本编辑器中是不可见的,但服务器会在 JPEG/GIF/PNG 数据之前将这几个额外的字节发送到浏览器。因此,浏览器会在数据的开头找到错误的签名。要解决此问题,请在记事本中创建一个空白文本文件,粘贴 php 代码并将文件保存为 ANSI 编码。

【讨论】:

    【解决方案2】:

    您可能会考虑的另一个选项(假设您使用的是 Apache):

    为所有图像扩展名(png、jpg、gif)创建一个带有mod_rewrite 的.htaccess 文件。

    让它重定向到查找数据库中请求的图像的 php 脚本。如果它在那里,它会回显标题和 BLOG。如果不存在,则返回标准 404。

    这样你就可以拥有:

    <img src="adorablepuppy.jpg" />
    

    然后被重定向 ala:

    RewriteEngine on
    RewriteRule \.(gif|jpg|png)$ imagelookup.php
    

    此脚本对图像进行查询,它(显然)假定请求的图像具有与 URL 中的文件名匹配的唯一键:

     $url = $_SERVER['REQUEST_URI'];
     $url_parts = explode("/", $url);
     $image_name = array_pop($url_parts);
    

    现在您只有图像文件名。进行查询(我将留给您,以及任何验证方法并检查地址中的真实文件等)。

    如果有结果:

     header('Content-type: image/jpeg');
     header('Content-Disposition: inline; filename="adorablepuppy.jpg"');
     print($image_blog);
    

    否则:

     header("HTTP/1.0 404 Not Found");
    

    仅供参考:我不知道这是否会影响性能。但它可以让你做我认为你想做的事,即使用简单的image 元素将图像输出为服务器上的平面图像文件。我倾向于同意 BLOB 不是最好的方法,但这确实避免了任何跨浏览器问题。

    【讨论】:

      【解决方案3】:

      我相信您遇到的问题是编码问题。该资源声称可以使用the print function.

      【讨论】:

      • 如果不是答案,那就不是答案 =(
      【解决方案4】:

      只需从数据库中获取图像。并使用正确的标题进行打印。

      $image = mysql_fetch_array(...)
      header("Content-type: image/jpeg"); // change it to the right extension 
      print $image['data'];
      

      出于性能原因...这是不可取的。将图像放入数据库的原因有多种,但最常见的是:

      a) 将它们编入索引(呵呵!)
      您可以通过将图像平面存储在服务器上并仅索引图像文件名来做到这一点。

      b) 隐藏/保护图像
      Flickr 等仍然将图像平面存储在服务器上并使用不同的方法。它们会生成一个很难找到的 URL。

      这个link points to a protected image 在我的帐户上。一旦知道正确的 URL,您仍然可以访问它。试试看!

      farm2.static - 一个 farm 已针对提供静态内容进行了优化
      1399 - 可能是服务器
      862145282 - 我的用户名
      bf83f25865_b - 图像

      为了找到我所有的秘密图像,任何用户都可以使用上述地址猛击 Flickr 并更改最后一部分。但这需要很长时间,并且用户可能会因为用数千个 404 敲击服务器而被阻止。

      也就是说几乎没有理由将图像存储在 BLOB 上。

      编辑:
      只是一个链接,指向比我在存储图像时why BLOB is not the way to go 解释得更好的人。

      【讨论】:

      • 仅供参考,我发现在数据库中管理 BLOB 是完全合理且合理的想法。在代码和存储中都更容易管理。我通常将 BLOB 从 DB 中流出,而不是 load-n-dump,但为什么讨厌 BLOB?
      • @Xepoch 我在尝试扩展客户站点时遇到了 BLOB 地狱。静态提供文件并将链接存储在数据库中要快得多。但是其他人的布局比我好得多:mysqldatabaseadministration.blogspot.com/2008/01/…
      • @Thilo,我相信 SO 不仅是要回答用户的问题,还要预测他的问题并分享您的知识。我直接回答了他的要求,然后告诉他为什么我认为这是一个坏主意。感谢您的评论!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 2013-12-31
      • 2014-03-19
      • 1970-01-01
      相关资源
      最近更新 更多