在PHP中从MySQL获取图像会导致图像损坏

时间:2015-02-10 14:39:43

标签: php mysql http-headers

我遇到了错误

  

"图片“.... image.php?id = 1878”无法显示,因为它包含错误。

这是我从db中检索图像内容的代码。 db中的数据是正确的,因为相同的文件与一些旧的PHP代码完美地显示。事实上,我使用的代码是完全相同的旧代码,我只是从许多链接(包含)的php文件中提取它,显然我错过了一些东西。

$query="SELECT image_original_file, mime_type, {$field_content} as content, {$field_content}_md5 as imhash, CHAR_LENGTH({$field_content}) as leng  FROM IMAGES WHERE ID_image={$_GET['id']}";
$res=mysql_query($query,DB_CON);
$myRow = mysql_fetch_row($res);
//Of course this echo statement is just for debuging, as echo causes the default headers to be sent.
echo "Fetched content length:".mb_strlen($myRow[2])." and MySQL length ".$myRow[4];
list($name,$type,$content,$imhash,$length)=$myRow;

这里的输出显示php中的内容长度是29179bytes,但在MySQL中它是28605(这是我保存图像时的正确大小)。 我想知道为什么在这些代码行之后PHP的内容大小不同。 DB中的filecontent不是base64编码的,原始代码也不对从db中检索的内容使用任何操作。我比较了旧代码的标题和" new"代码,除内容长度以外的所有内容都是相同的。我怀疑这是某种角色问题?

我试过了:

 mysql_set_charset('utf8',$con);
 mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", DB_CON);
 mysql_query("SET NAMES utf8",DB_CON);

但问题仍然存在。我会很乐意提供一些建议。

将图像发送到浏览器,如下所示:

header("ETag: \"{$imhash}\"");
header("Expires: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: must-revalidate");
header("Accept-Ranges: bytes");
header("Content-Length: ".mb_strlen($content));
header("Content-Type: {$type}");
header("Content-Disposition: inline; filename=\"{$name}\";");
echo $content;

1 个答案:

答案 0 :(得分:1)

您的图片数据正在转义,例如引号字符"正在变为\",这会破坏图片。

确保php.ini配置文件中的magic_quotes_gpcmagic_quotes_runtimemagic_quotes_sybase不是On

PHP Magic Quote Directives