为什么我的图像存储为MySQL longblobs仅部分显示?

时间:2009-02-23 22:30:54

标签: mysql image

客户刚刚要我解决他们的网络问题。我没有建立它,但这是正在发生的事情。

图像作为longblobs存储在数据库中。在搬到新服务器之前,一切正常。在新服务器上,部分图像仅部分显示。即使图像以所需的宽度和高度显示,超过一半的图像也是白色或灰色。 编辑:只有服务器更改后上传的图片才会受到影响!

这用于将图像读入数据库以进行数据库插入:

move_uploaded_file($_FILES['imagefile1']['tmp_name'],"tmppic.img")) 
$tmpstr = fopen("tmppic.img","rb");
$image = addslashes(fread($tmpstr,filesize("tmppic.img")));

以下是用于显示图像的PHP函数:     imagecreatefromstring,     imagecreatetruecolor,     imagecopyresampled,     imagejpeg

由于这在服务器移动后开始发生,我怀疑服务器配置。

发生了什么事?

6 个答案:

答案 0 :(得分:3)

Dunno如果它正在扼杀你,但你肯定需要将addslashes()更改为mysql_real_escape_string()。 SQL注入啊...

答案 1 :(得分:3)

好的,想通了。看下面的代码。

if (move_uploaded_file($_FILES['imagefile1']['tmp_name'],"tmppic.img")){
$tmpstr = fopen("tmppic.img","rb");
$image = addslashes(fread($tmpstr,filesize("tmppic.img")));

上传的文件将移至tmppic.img文件中。该文件经常被使用。问题是filesize(“tmppic.img”)在 move_uploaded_file之前返回文件的大小。因此,如果之前的tmppic.img有120k文件大小并且新上传的文件较大,则只读取120K的信息,因此图片中的灰色区域。

我通过将文件大小(“tmppic.img”)替换为

来解决了这个问题
$file_size = $_FILES['imagefile1']['size'];
$image = mysql_real_escape_string(fread($tmpstr,$file_size));

这是一个错误吗?

答案 2 :(得分:1)

确认您的图片字段设置为正确的BLOB类型。

我有同样的问题,这是一个死的简单解决方案;我将我的图像字段设置为“Blob”而不是“LongBlob”。我的数据库无法在字段中分配足够的空间来存储图像数据。将其更改为LongBlog,效果很好!

答案 3 :(得分:0)

在服务器移动期间,数据可能会被破坏 - 特别是如果数据被转储然后重新插入。你能确认整个图像数据实际上在数据库中吗?

编辑:刚刚看到您对该问题的修改。你能确认新图像是否完全插入到数据库中了吗?这可能是插入问题。

答案 4 :(得分:0)

如果图像通过ftp传输到新服务器,则传输模式可能未正确设置(即ascii与二进制)。如果您在ascii ftp模式下传输二进制文件,它可能会将图像中的某些字节解释为换行符并尝试将它们转换为Windows(CRLF)或UNIX(LF)等模式。这通常会破坏图像,因此不完全可读。

答案 5 :(得分:0)

您使用的是什么MySQL库?某些版本的MySQLi库在从数据库中正确检索blob时遇到问题。

我会验证您是否在两台服务器上运行相同版本的PHP和相关的MySQL库。