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