【问题标题】:Uploaded image not being stored properly in the database (php mysql)上传的图像未正确存储在数据库中(php mysql)
【发布时间】:2011-06-30 00:42:36
【问题描述】:

我正在尝试将上传的图像存储在数据库中。但是,图像不会显示,当我在图像列中查看带有 phpmyadmin 的表格时,我会看到 [BLOB - 20B] 之类的东西,而不是它应该具有的实际大小。

显示脚本工作正常,因为我通过 phpmyadmin 而不是我的上传脚本插入了图像,并且显示正常。

我的表格:

<form id="productForm" action="index.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="product_id" value="' . $values['product_id'] . '" />
<input type="file" name="image" />
</form>

处理代码:

$clean['image'] = mysqli_real_escape_string($dbc, file_get_contents($_FILES['image']['tmp_name']));

mysqli_query($dbc, "
  INSERT INTO product_images (product_id, mime, image)
  VALUES ('{$clean['last_product_id']}', '{$clean['mime']}', '{$clean['image']}')
");

我省略了所有不相关的内容,因为其他事情似乎运行良好。

谢谢

【问题讨论】:

  • [BLOB - 20B] 是 phpMyAdmin 的 BLOB 数据占位符。显示图片有问题吗?
  • 在我看来,它告诉我只存储了 20 个字节!这些图像不显示。我从 phpmyadmin 手动添加的那个说 92KB 什么的,显示正常。
  • 用一些代码更新了我的答案以尝试...

标签: php mysql database image store


【解决方案1】:

抱歉,这不是对您问题的直接回答,但我建议您的方法不是最好的方法 - 以至于我建议您尽可能放弃它。

在数据库中存储图像数据是可能的,但这是您可以做但不应该做的事情之一。如果您的脚本看到即使是适度的使用,您的数据库也会很快变得庞大而笨重。尤其是在索引不佳或缺失的情况下,您可以预期您的数据库性能会随着每条添加记录的表大小膨胀而下降。

除了数据库大小之外,还需要维护可以检索图像数据并以客户端可以使用的方式输出图像数据的代码的额外复杂性。您不能只使用print 数据,您必须发送标头以表明它是图像,这意味着单独的脚本、额外的 http 请求和额外的数据库调用。

总之,这是一种不好的使用方法。最好将文件写入磁盘,然后将路径作为字符串存储在数据库中,我可以补充一下,从代码的角度来看,这更容易做到。以后利用这些数据也更加容易。

祝你好运!

编辑

顺便说一下,试试这个来更正你当前的代码:

$instr = fopen($_FILES['image']['tmp_name'],"rb");
    $image = addslashes(fread($instr,filesize($_FILES['image']['tmp_name'])));
    mysqli_query($dbc, 'INSERT INTO product_images (product_id, mime, image)
      VALUES ("'.$clean['last_product_id'].'", "'.$clean['mime'].'", "'.$image.'")';

【讨论】:

  • 感谢您的回复。我已经有一个像你描述的那样的系统,但我只是想看看替代方案。我认为没有害处:-)
  • 加上客户端对数据包大小的限制服务器协议 - 文件很容易超过限制并终止连接。
  • @Booya 不,尝试其他方法没有害处。但是,我认为应该始终努力改进他们当前的方法。举个例子,一个拿着放大镜的人尝试把石头砸在一起生火是没有意义的。他应该研究打火机。学习一种从当前方法倒退的方法,你什么也得不到。
  • @Chris 问题是,我见过两者的拥护者,所以我想亲眼看看并判断。
  • @Marc B 有趣的是,我设法只用 essnetials 制作了一个完全简单的脚本并且它有效,但同样的事情在我的正常页面上不起作用,我无法弄清楚为什么。页面上的其他内容与此无关。
【解决方案2】:

显然这与逃跑有关。在我使用 sprintf() 形成的实际查询之前,我最终没有转义任何东西

$clean['qText'] = sprintf("
  INSERT INTO product_images (product_id, mime, image)
  VALUES ('%d', '%s', '%s')",

  mysqli_real_escape_string($dbc, $clean['last_product_id']),
  mysqli_real_escape_string($dbc, $clean['mime']),
  mysqli_real_escape_string($dbc, file_get_contents($_FILES['image']['tmp_name']))
);

mysqli_query($dbc, $clean['qText']);

【讨论】:

  • 现在单击此答案旁边的绿色复选标记以“接受”。你不想留下开放式问题……你做的越多,愿意回答你未来问题的人就越少。 :)
  • 最终我最终还是使用了文件系统。使用数据库有一些缺点,例如没有缓存,这使得整个事情有点慢。 :)
猜你喜欢
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多