为什么有些图像无法渲染

时间:2013-05-19 07:23:36

标签: php mysql image

我的程序使用PHP将各种大小的图像上传到MySQL数据库的blob字段中。我能够成功上传不同大小,高达1MB及以上。我的问题是,当我显示它们时,我能够显示小于10KB的图像。对于较大的图像,显​​示错误 .....无法显示,因为它包含错误 (在Firefox中),而在Chrome中,它只显示图像占位符。我尝试了很多技巧,我到处搜索过。我编辑了php.ini和my.ini。我的程序是一个Intranet应用程序,一次只有不到50个用户。这是用于显示图像的脚本:

如果我删除标题('Content-Type:'。$ resource_type),它会在屏幕上转储二进制代码。我已将MySQL数据包大小增加到100MB,问题仍然存在。

    $d_id= $_GET['k'];$query="";$query_handle=0;$row="";$no_of_rows=0;
    $query="SELECT * FROM tdoc ";
    $query.=" WHERE ucase(trim(fsha_doc_key))='".strtoupper(trim($d_id))."' ";
    $query_handle=mysql_query($query,$conn_handle);
    if(!$query_handle) {$error_flag=1;echo '<br />Unable to execute query to Extract Resource CODE:FREF';}
    if($query_handle) $no_of_rows=mysql_num_rows($query_handle);
    if(($query_handle)&&($no_of_rows<=0)) {$error_flag=1;echo '<br />The Exact Resource: '.strip_tags($d_id).' NOT found ';}
    if(($query_handle)&&($no_of_rows>0)){
        $row=mysql_fetch_assoc($query_handle);
        $resource_type=trim($row['ftype']);
        $resource_size=$row['fsize'];
        $resource_h=$row['fheight'];
        $resource_w=$row['fwidth'];
        $d_resource=$row['fdoc'];
        header('Content-Type: '.$resource_type);
        header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' );
        header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
        header( 'Cache-Control: no-store, no-cache, must-revalidate' );
        header( 'Cache-Control: post-check=0, pre-check=0', false );
        header( 'Pragma: no-cache' );
        header('Content-Length: '.filesize($d_resource));
        header('Content-height: '.$resource_h);
        header('Content-width: '.$resource_w);
        echo stripslashes(base64_decode($d_resource));
    }

我在这里专门阅读了有关此错误的帖子,但没有解决我的具体问题,因为我的是显示小尺寸图像,但不是10kb以上的图像。 10kb与我预计的平均图像大小相差甚远,以后会上传。请帮忙。

3 个答案:

答案 0 :(得分:0)

如果$d_resource是二进制图像数据

你应该使用imagejpeg或imagegif或其他系列函数,而不是echo

请参阅Output image to browser or file - PHP

答案 1 :(得分:0)

将类型从BLOB(或甚至TEXTVARCHAR?)更改为MEDIUMBLOBLONGBLOB,请参阅storage requirements

TINYBLOB, TINYTEXT  L + 1 bytes, where L < 2^8
BLOB, TEXT  L + 2 bytes, where L < 2^16
MEDIUMBLOB, MEDIUMTEXT  L + 3 bytes, where L < 2^24
LONGBLOB, LONGTEXT  L + 4 bytes, where L < 2^32

BLOB的大小为2 ^ 16,但实际大小较小,因为您base64_encode图像(如果您使用存储二进制数据的BLOB,则不需要这样做。)

另请注意John对您的问题的评论:如果您没有$d_id,则应向magic_quotes_gpc添加斜杠。

答案 2 :(得分:0)

您可能正在达到内存限制,因为您携带的是图像的多个副本。 $ row [fdoc]中有一个,$ d_resources中有一个。而你应该删除striplashes调用,它不会对你有所帮助。