【问题标题】:Display image blobs, possible encoding error显示图像 blob,可能的编码错误
【发布时间】:2013-04-18 21:22:18
【问题描述】:

我有一个表单,用户可以将图像上传到我的 MySQL 数据库。该表包含三列:idnameimageImage 是具有默认设置的 blob 列。我能够存储图像数据,但是当我获取数据并尝试将其显示在网页上时,我得到了一个损坏的图像(在这种情况下它是一个 jpeg 文件)。

我怀疑某处的编码有问题。我的 upload.php 文件以 UTF-8 编码,没有 BOM。这是我的上传代码:

$image = addslashes(file_get_contents($_FILES['image']['tmp_name']));
$image_name = addslashes($_FILES['image']['name']);

$insert = $conn->prepare('INSERT INTO images VALUES(:id,:name,:image)');
$insert->bindValue(':id', '');
$insert->bindParam(':name', $image_name);
$insert->bindParam(':image', $image);
$insert->execute();

这就是我尝试显示图像的地方。

$select = $conn->prepare('SELECT image FROM images WHERE id = 2');
$select->execute();

$display = $select->fetch();

echo '<img src="data:image/jpg;base64,' . base64_encode( $display['image'] ) . '" />';

我观看了有关 MySQL 中 blob 的视频教程,其中 blob 列具有 binaryattribute。但是,当我尝试创建这样的列时,我收到错误 1064。我什至不知道这与此有什么关系。

【问题讨论】:

    标签: php mysql blob


    【解决方案1】:

    首先,您不应该将addslashes() 与准备好的语句一起使用(这不是您的问题)。

    默认情况下-&gt;bindParam() 默认类型为PDO::PARAM_STR,因此您需要指定您传递的数据不是字符串。

    试试:

    $insert->bindParam(':image', $image, PDO::PARAM_LOB);
    

    在数据库中存储二进制数据也会导致各种问题。我建议将文件存储到磁盘并将路径存储在数据库中 - 它具有各种优势。

    【讨论】:

    • 有效!虽然,由于某种原因,图像正在被裁剪。也许这是你提到的问题之一。无论如何,谢谢!
    • 不客气。如果不使用图形库,很难意外裁剪图像,所以我怀疑它是页面的 HTML/显示中的东西。
    • 哦,好的。只是好奇,在数据库中存储二进制数据有哪些问题?
    • 根据存储引擎和数据量,您最终可能会发现数据库非常臃肿。文件系统有利于存储文件,并且在实际成本和性能方面通常要便宜很多倍。您也不能从数据库流式传输文件 - 例如使用系统的 sendfile() 函数,当你不想仅仅读取一个文件就吃掉 PHP 的所有内存时,这很重要。
    • 再次感谢您的帮助。
    猜你喜欢
    • 2017-11-27
    • 2015-08-08
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2019-05-31
    相关资源
    最近更新 更多