无法显示图片,因为它包含错误

时间:2014-04-06 18:08:48

标签: php mysql image

我一直在尝试在PHP中显示最近3个小时的图像。我关注了如何实现这一点的几个线程,并在stackoverflow和其他论坛上传递了2个小时来尝试解决问题。

以下代码是我使用的代码的减少。 (我有更多的代码来处理jpeg,png和不同的SQL表)

MySQL设置

我有一个名为 teams 的表,其中我有以下3个值: id image mime

当前的PHP代码

我有一个名为show_image.php的文件,我为其传递了一个id以获得正确的图像。

if(isset ($_get['id'])) {
    $id = $mysqli->real_escape_string($_GET['id']);
    $query = 'SELECT `image` FROM `teams` WHERE `id` = ?';

    if ($stmt = $mysqli->prepare($query)) {
        $stmt->bind_param('i', $id);
        $stmt->execute();
        $stmt->store_result();
        if ($stmt->num_rows == 1) {
            $stmt->bind_result($image);
            $stmt->fetch();
            header('Content-Type: image/jpeg');    // I can use the DB query to change the type is needed
            echo $image;
        }
    }
}

就像每个人在互联网上说的那样,我只是在我的html文件中访问图像

<img src="show_image.php?id=1" />

结果

当我调用php代码(或直接转到路径/show_image.php?id=1)时,我收到一条消息“无法显示图像[URL],因为它包含错误”。 (我多次对谷歌和DuckDuckGo这个错误。)

我最接近它的工作是当我评论标题的行('Content-Type:image / jpeg'); 我可以看到二进制代码(转换为字符)对于图像。虽然当我检查页面的属性时,它从image / jpeg更改为text / html(如预期的那样)

我还尝试用

替换 echo $ image;
$img = imagecreatefromjpeg($image);
$imagejpeg($img);
$imagedestroy($img);

但它也不起作用。

编辑 - 在数据库中插入图像

if (isset ($_FILES) && is_array($_FILES)) {
    $filename = $_FILES['team-logo']['name'][0];
    $filesize = $_FILES['team-logo']['size'][0];
    $filetype = $_FILES['team-logo']['type'][0];

    if (substr($filetype,0,5) == "image") {
        $imagedata = $mysqli->real_escape_string(file_get_contents($_FILES['team-logo']['tmp_name'][0]));
    } else {
        $error_msg .= '<p class="error">You need to select and image</p>';
    }
}

if (empty($error_msg)) {
    if ($insert_stmt = $mysqli("INSERT INTO `teams` (`id`, `image`, `mime`) VALUES ('', ?, ?)")) {
        $insert_stmt->bind_param('ss', $imagedata, $filetype);
        if (! $insert_stmt->execute()) {
            //Display error
        }
        //Else image was inserted successfully 
    }
}

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

问题很可能是因为您使用real_escape_string转义二进制数据,然后通过绑定参数存储它。

插入代码更改为以下内容...

$imagedata = file_get_contents($_FILES['team-logo']['tmp_name'][0]);

// snip

if ($insert_stmt = $mysqli("INSERT INTO `teams` (`image`, `mime`) VALUES (?, ?)")) {
    $insert_stmt->bind_param('ss', $imagedata, $filetype);
    if (! $insert_stmt->execute()) {
        //Display error
    }
    //Else image was inserted successfully 
}

为了说明问题,请说明您的二进制数据包含以下内容......

1234'5678

通过real_escape_string运行此操作会产生类似这样的内容

1234\'5678

1234''5678

取决于MySQL当时如何逃避字符串。

将此绑定到 insert 语句时,这些转义字符将字面存储,从而破坏二进制数据。

绑定参数是将值注入查询的最安全方法。您需要清理这些值字符串,以便在查询中安全使用。