【问题标题】:Why are some images not rendering为什么有些图片不渲染
【发布时间】:2013-05-13 23:55:37
【问题描述】:

我的程序使用 PHP 将各种大小的图像上传到 MySQL 数据库的 blob 字段中。我能够成功上传高达 1MB 及以上的不同大小。我的问题是,当我显示它们时,我能够显示小于 10KB 的图像。对于较大的图像,会显示一个错误.....无法显示,因为它包含错误(在 Firefox 中),而在 Chrome 中,它只是显示一个图像占位符。我尝试了很多技巧,并且到处搜索。我编辑了 php.ini 和 my.ini。我的程序是一个内网应用,一次会少于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 与我预计稍后上传的平均图像大小相差甚远。请帮忙。

【问题讨论】:

  • 这看起来你可能对 SQL 注入开放?
  • 只是一个建议,您不应该将整个文件保存在数据库中,您应该将其保存在服务器上的目录中,然后在 msql 中引用文件的链接...

标签: php mysql image


【解决方案1】:

如果$d_resource是二值图像数据

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

Output image to browser or file - PHP

【讨论】:

    【解决方案2】:

    将类型从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 对您的问题的评论:如果您没有打开 magic_quotes_gpc,则应在 $d_id 中添加斜杠。

    【讨论】:

      【解决方案3】:

      您可能会达到内存限制,因为您携带了多个图像副本。一个在 $row[fdoc] 中,一个在 $d_resources 中。而且您可能应该删除 stripslashes 调用,它对您没有任何帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-27
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多