2009-02-23 51 views
2

一位客户刚要我通过他们的网站解决问题。我没有建立它,但这是发生了什么。为什么我的图像仅以部分显示方式存储为MySQL longblobs?

图像以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

由于服务器移动后发生这种情况,我怀疑服务器配置。

这是怎么回事?

+0

好的,所以只有一些图像会受到影响,并且只有自服务器更改显示不正确才上载的图像。自服务器更改显示不正确或仅显示某些图像后,是否上传所有图像? – 2009-02-23 23:23:31

回答

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文件中。该文件被不断使用。问题是文件大小(“tmppic.img”)正在返回文件的大小,之前是move_uploaded_file。因此,如果之前的tmppic.img文件大小为120k,并且新上传的文件较大,则只会读取120K的信息,因此图片中的灰色区域会被读取。

我固定用

$file_size = $_FILES['imagefile1']['size']; 
$image = mysql_real_escape_string(fread($tmpstr,$file_size)); 

这是一个错误替换文件大小( “tmppic.img”)的问题?

3

不知道是什么让你失望,但你肯定需要将addslashes()更改为mysql_real_escape_string()。 SQL注入ahoy ...

0

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

编辑:刚刚看到您的编辑问题。你能否确认新图像被完全插入到数据库中呢?这可能是一个插入问题。

0

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

0

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

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

1

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

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