从 PHP 中的 MySQL 获取图像导致图像损坏
Getting image from MySQL in PHP results in damaged image
我被错误困住了
"The image “....image.php?id=1878” cannot be displayed because it contains errors.
这是我从数据库中检索图像内容的代码。 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 中内容的大小不同。数据库中的文件内容不是 base64 编码的,原始代码也没有对从数据库中检索到的内容进行任何操作。我比较了旧代码的 Headers 和 "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;
您的图像数据正在被转义,例如引号字符 "
被转换为 \"
,这会损坏图像。
确保 magic_quotes_gpc
、magic_quotes_runtime
和 magic_quotes_sybase
不在 php.ini 配置文件中 On
。
我被错误困住了
"The image “....image.php?id=1878” cannot be displayed because it contains errors.
这是我从数据库中检索图像内容的代码。 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 中内容的大小不同。数据库中的文件内容不是 base64 编码的,原始代码也没有对从数据库中检索到的内容进行任何操作。我比较了旧代码的 Headers 和 "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;
您的图像数据正在被转义,例如引号字符 "
被转换为 \"
,这会损坏图像。
确保 magic_quotes_gpc
、magic_quotes_runtime
和 magic_quotes_sybase
不在 php.ini 配置文件中 On
。