将图像从磁盘导入 MySQL 数据库时图像损坏

Posted

技术标签:

【中文标题】将图像从磁盘导入 MySQL 数据库时图像损坏【英文标题】:Image corrupted while importing images from disk to MySQL Database 【发布时间】:2012-08-20 06:33:46 【问题描述】:

首先,感谢您查看此内容。请允许我解释一下:

我在磁盘上有图像,我想将它们放入数据库中的 longblob 字段中。我读到这通常是不鼓励的,但这仍然是我的应用程序中需要的东西。

要导入图像,我的班级中有以下代码:

$file_handle = fopen("$folder_path/$image","rb");
$file_content = fread($file_handle,filesize("$folder_path/$image"));

$image_record["file_name"] = $image;
$image_record["file_folder_id"] = $folder_data["folder_id"];
$image_record["file_owner_id"] = $this->current_user_data["user_id"];
$image_record["file_mime_type"] = mime_content_type("$folder_path/$image");
$image_record["file_binary"] = addslashes($file_content);

if($this->db_insert("file", $image_record))


    $this->view_file($this->load_file($image));
    echo header("Content-type:".$image_record["folder_type"]);
    $this->view_file($this->load_file($image));
    echo stripslashes($image_record["folder_binary"]);

当我尝试将二进制文件保存到数据库时,图像数据似乎被该进程损坏了。

使用完全相同的代码,$db->insert() 语句在另一个具有几乎相同数据库架构的网站上工作得很好,除了它工作的事实,存储引擎是 InnoDB 而不是 MyISAM。

if 语句中的代码始终显示图像,因此我怀疑读取或显示文件时发生的数据损坏。

请帮助我了解发生了什么。

谢谢!

【问题讨论】:

为什么要添加斜杠?你的实际数据库类是做什么的? DB 不是存储图像的好地方,但您确定它是一个 blob 吗? 可能是您的其他数据库中的字段无法处理正确长度的数据。 BLOBTEXT 字段默认限制为 64KB,这对于大多数图像来说是不够的。 $this->db_insert 中发生了什么?您可以简单地读取文件数据并将该数据存储在一个 blob 中,然后使用另一个字段来存储其余的图像数据...... @user1623192,你在说什么? addslahes() 不会逃避您的数据。如果您使用addslashes(),则需要返回并删除它的每个实例,并为您的数据库使用真正的转义函数。更好的是,使用准备好的查询,然后你就不用担心了! addslahes() 无疑是您的问题所在。 【参考方案1】:

您应该对图像进行 base64 编码并将它们存储在一个长文本字段中,至少这是我所做的,我发现它工作得很好。此外,当从您的数据库中获取 base64 记录时,您实际上可以将 base64 字符串回显到 images src 属性中......这是文档:http://php.net/manual/en/function.base64-encode.php

【讨论】:

-1,绝对不需要使用带有 base-64 编码数据的文本字段。 Blob 用于存储二进制数据,以这种方式对其进行编码/解码效率低下。 @Brad 两种方法各有利弊,我发现使用 base64 更容易,特别是因为最近我一直在为手机编写 html5 并使用画布等...感谢您个人意见的 -1 ,也许你应该看看这个答案,它只是众多答案之一:***.com/questions/9722603/… 我不熟悉这种技术。所讨论的效率低下是非常痛苦的,还是从学术角度来看只是效率低下? 这不仅仅是一种观点,它是一个事实陈述。问题指出数据库有一个 BLOB 列。因此,不需要数据的文本兼容表示。在不需要时使用 base-64 编码会浪费存储空间,并且会(少量)浪费 CPU 进行编码。您发现在客户端的工作更容易与服务器端的数据存储问题无关。 @user1623192,Base-64 编码比原始二进制数据需要大约 33% 的存储空间。这是否非常痛苦取决于您的使用情况。

以上是关于将图像从磁盘导入 MySQL 数据库时图像损坏的主要内容,如果未能解决你的问题,请参考以下文章

从数据库 php 和 mysql 中检索图像的损坏的文件图标

使用 PDO 问题从 MySQL 检索图像

将图像转换为 JSON 时发生错误(数据损坏),反之亦然

将二进制图像从数据库保存到文件夹时出错

损坏的图像链接的图像占位符?

从 SummerNote WYSIWYG Bootstrap 生成的图像损坏