1

我在这里看到了关于堆栈溢出的类似问题,但我不明白答案,所以我想,我会自己发布问题并与任何有帮助的程序员通信。我正在尝试显示存储在数据库中的图像,但图像链接已损坏。我有两个php文件如下:

<html>
<head>
    <title>Upload an image</title>
</head>
<body>
<form action="image_practice.php" method="POST" enctype="multipart/form-data">
    Image: <input type="file" name="image"> <input type="submit" value="Upload Image">
</form>
    <?php
if (function_exists('hex2bin') !== true)
    {
        function hex2bin($data)
        {
            return pack("H*", $data);
        }
    }
        //file properties
        $file= $_FILES['image']['tmp_name'];
        if (!isset($file))
            echo "Please select an image";
        else{
            $image = bin2hex(file_get_contents($_FILES['image']['tmp_name']));
        $image = hex2bin($image['Image']);
            if ($image_size==FALSE)
                echo "That's not an image";
            else {
                if(!$insert = mysql_query("INSERT INTO ImageDetails VALUES('','$image_name','$image')"))
                    echo "Problem Uploading image.";
                else {
                  $lastid= mysql_insert_id();
                  echo "Image Uploaded.<p />Your Image:<p \><img src='GetImage_prac.php?id=$lastid'>";
                }
            }
        }
        ?>
    </body>
    </html>

然后是另一个显示图像的 php 文件,如下所示:

<?php
  if (function_exists('hex2bin') !== true)
{
    function hex2bin($data)
    {
        return pack("H*", $data);
    }
}$id=addslashes($_REQUEST['id']);
  $image= mysql_query("SELECT * FROM ImageDetails WHERE id=$id");
  $image= mysql_fetch_assoc($image);
  $image= $image['Image'];
  header("Content-type: image/jpeg");
  echo $image;
?>

我不明白为什么图像不显示。任何人都可以帮忙吗?我认为表定义如下:

CREATE TABLE ImageDetails2
(
ImageId int NOT NULL AUTO_INCREMENT,
Name varchar(30) NOT NULL,
Image BLOB,
PRIMARY KEY(ImageId)
);
4

3 回答 3

1

这是对可能导致错误的事情的一个镜头,但它可能是另一个:

检查输出图像的 php 文件的开头是否没有 unicode BOM。

为此(甚至更多),请在浏览器出现错误时保存图像,将其重命名为文本,或使用十六进制编辑器查看它并将其与初始图像进行比较。

BOM 在非 unicode(十六进制)编辑器中看起来像这样:。

于 2013-05-10T15:01:58.947 回答
1

罪魁祸首大概是mysql_real_escape_string()


另外,请记住BLOBMySQL 数据类型的限制为 64KB,由于 base64 编码膨胀,这表示真正的文件限制约为 48KB - 如果您尝试上传更大的文件,它会被截断,它会之后显示损坏的文件(= 不显示)。


好的,我重新做了你的整个代码,问题是显示脚本中的查询:

SELECT * FROM ImageDetails WHERE id=$id

应该:

SELECT * FROM ImageDetails WHERE ImageId=$id

无论如何,这里是,所有的固定和改进。它现在必须工作:


<html>
    <head>
        <title>Upload an image</title>
    </head>

    <body>
        <form action="image_practice.php" method="POST" enctype="multipart/form-data">
            <label for="image">Image:</label>
            <input type="file" name="image" id="image">
            <input type="submit" value="Upload Image">
        </form>
        <?php

        if ((strcasecmp('POST', $_SERVER['REQUEST_METHOD']) === 0) && (isset($_FILES) === true))
        {
            if (exif_imagetype($_FILES['image']['tmp_name']) != false)
            {
                $image = file_get_contents($_FILES['image']['tmp_name']);
                $image_name = mysql_real_escape_string($_FILES['image']['name']);

                $image = base64_encode($image); 

                if (mysql_query("INSERT INTO ImageDetails VALUES ('', '$image_name', '$image');") !== false)
                {
                    echo 'Image Uploaded.<p />Your Image:<p \><img src="GetImage_prac.php?id=' . mysql_insert_id() . '">';
                }

                else
                {
                    echo "Problem Uploading image.";
                }
            }

            else
            {
                echo "That's not an image.";
            }
        }

        ?>
    </body>
</html>

<?php

// connect to MySQL here

if (array_key_exists('id', $_REQUEST) === true)
{
    $query = mysql_query("SELECT * FROM ImageDetails WHERE ImageId = " . intval($_REQUEST['id']) . " LIMIT 1;"); # you had "WHERE id" here!
    $result = mysql_fetch_assoc($query);

    if ($result !== false)
    {
        $image = $result['Image'];

        $image = base64_decode($image);
    }
}

if (isset($image) === true)
{
    header('Content-type: image/jpeg'); echo $image;
}

else # display a 1x1 spacer GIF as fallback
{
    $image = base64_decode('R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==');

    header('Content-type: image/gif'); echo $image;
}

?>
于 2013-05-10T14:24:16.697 回答
0

如果您使用 chrome 右键单击​​损坏的图像并检查元素并查看代码有什么问题。

你有数据库行内的 img src 的 html 吗?如果是这样,把它放在那里很浪费,它应该在 php 文件中,如果你不这样做,那就是你的问题

于 2013-05-10T14:17:47.807 回答