【问题标题】:Getting broken image retrieving BLOB with PHP使用 PHP 获取损坏的图像检索 BLOB
【发布时间】:2015-11-20 16:49:23
【问题描述】:

仅作记录,这是使用 Wordpress 完成的(我没有选择它,也没有将图像存储在数据库中)。

基本上我正在尝试使用 php 在数据库中存储和图像并稍后显示它,但我得到一个损坏的图像图标。 (相信我,我一直在研究这个,但我找不到问题所在)。

这就是我存储图像的方式:

HTML:

<input type="file" name="img" id="media">

PHP:

$item['media'] = addslashes (file_get_contents($_FILES['img']['tmp_name']));
$result = $wpdb->insert($table_name, $item);

这就是我试图检索它的方式:

HTML:

<img src="Image_View.php?image_id=<?php echo $item["item_id"]; ?>"/>

Image_View.PHP:

<?php
  global $wpdb;
  $result =  $wpdb->get_row("SELECT media FROM $wpdb->item WHERE item_id = 3", ARRAY_A);
  header("content-type: image/png");
  echo $result["media"];
?>

顺便说一句!这是我在 Stackoverflow 中的第一个问题!大家好!


编辑 1:

正如 hanshenrik 提到的,$wpdb->insert 正在转义输入,所以我上传并图像然后将其写入磁盘,设置正确的扩展名和 BOOM 就可以了,现在我知道我实际上是以正确的方式上传图像,但看起来我在尝试显示它时仍然遇到问题,当使用 chrome 的开发人员工具时,我得到了这个:

GET http://127.0.0.1/pymes/wp-admin/Image_View.php500(内部服务器错误)

那么,Image_View.php 有问题吗?查询实际上很好,并且正在检索数据,因为我将该代码复制并粘贴到另一个地方,它回显了 bin 文件中的整个字符。


编辑 2:

再来一次!抱歉迟到了,我一直在工作

所以,我在上传图片时遇到的问题的解决方案已在编辑 1 中进行了解释(感谢 hanshenrik 建议 wpdb insert 正在转义输入)。

关于显示图像,我在发送标头之前遇到了麻烦:

header("content-type: image/png");

所以我为此苦苦挣扎,我决定尝试对图像使用 URI,这解决了我的问题。对我来说,这更像是一种解决方法,而不是实际的修复,但它让我的船浮起来。我实现URI的方式如下:

<?php
global $wpdb;
$result =  $wpdb->get_row("SELECT media FROM $wpdb->item WHERE item_id = $_GET[id]", ARRAY_A);

echo '<img src="data:image/png;base64,'.base64_encode($result['media']).'" height="100" width="100"/>';
?>

通过这样做,我不再需要 Image_View.php 文件。

非常感谢这里提供的帮助,TY 伙计们!

【问题讨论】:

  • 您好!我认为最有可能的是图像在您存储时已被addslashes (file_get_contents($_FILES['img']['tmp_name'])); 损坏
  • 我想我可能已经将图像转换为base64,然后如果我必须将图像存储在 MYSQL 数据库中,则将其存储。 See this
  • 简单测试,从数据库中读取 blob,使用正确的 extn 将其写入磁盘。如果您无法使用图像查看器打开它,那么它就会被商店流程所困扰。
  • 你是对的!我已经尝试更改扩展名,但无法打开它。抱歉迟到了,没想到有人会回答我,因为我看到问题一直在下降哈哈
  • 那么,我能做什么,如果你知道我可以遵循的任何指南,我对此有点陌生,并且在大多数示例中,我发现他们使用了 addlashes 函数@ RiggsFolly

标签: php html image blob store


【解决方案1】:
$item['media'] = addslashes (file_get_contents($_FILES['img']['tmp_name']));
$result = $wpdb->insert($table_name, $item);

加斜杠?你疯了吗?如果 $wpdb->insert 没有为您转义,请使用适当的 SQL 转义函数。

无论如何,使用您当前的代码,这可能会起作用..

 echo stripslashes($result["media"]);

或许

echo htmlspecialchars(stripslashes($result["media"]));

【讨论】:

  • 哇!看起来你搞定了!显然 $wpdb->insert 确实转义了数据!也许这就是麻烦=#我试试这个!
  • data:(数组)要插入的数据(在列 => 值对中)。 $data 列和 $data 值都应该是“原始的”(都不应该是 SQL 转义的)。来自 wp codex
  • 好的!到目前为止一切顺利,我跳过了addlashes,现在当我将图像写入磁盘并设置正确的扩展名时,我实际上可以看到它(这是我以前做不到的!)
  • 我不知道我是否应该这样做,但@hanshenrik 问题已更新。
  • ..现在我想看看你的脚本生成的确切 html :p
【解决方案2】:

所以,我在上传图片时遇到的问题的解决方案已在编辑 1 中进行了解释(感谢 hanshenrik 建议 wpdb insert 正在转义输入)。

关于显示图像,我在发送标头之前遇到了麻烦:

header("内容类型:图片/png"); 所以我为此苦苦挣扎,我决定尝试对图像使用 URI,这解决了我的问题。对我来说,这更像是一种解决方法,而不是实际的修复,但它让我的船浮起来。我实现URI的方式如下:

get_row("SELECT media FROM $wpdb->item WHERE item_id = $_GET[id]", ARRAY_A);

回声''; ?> 通过这样做,我不再需要 Image_View.php 文件。

非常感谢这里提供的帮助,TY 伙计们!

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多