我在这里看到过类似的关于堆栈溢出的问题,但我不明白答案,所以我想,我应该自己发布问题并与任何有帮助的程序员通信。我试图显示这是存储在数据库中的图像,我得到一个破碎的图像链接。我有两个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)
);
这是一个可能导致错误的东西,但它可以是另一个:
检查在输出图像的php文件的开头处是否没有unicode BOM。
要做到这一点(甚至更多),在浏览器显示错误时保存图像,将其重命名为文本,或者使用十六进制编辑器查看它并将其与初始图像进行比较。
BOM在非unicode(十六进制)编辑器中看起来像这样:。
可能是mysql_real_escape_string()
。
另外,请记住,BLOB
MySQL数据类型的限制为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;
}
?>
如果你使用的是chrome浏览器右键点击破碎的图像和检查元素,看看什么是错误的代码。
你有数据库行内的img src的html吗?如果是这样的话,那就太浪费了它应该在PHP文件中如果你没有,那就是你的问题了