2009-05-25 162 views
1

嗨我的数据库中有一个图像表。这些存储为blob以及诸如图像类型&名称的详细信息。从blob显示图像mysql

我有问题显示图像,我得到的只是一个带有红色十字的白色盒子。 代码:

<?php 

include '../connection.php'; 

$ID = $_GET['id']; 

$query = "SELECT * FROM `images` WHERE `image_id` = '$ID'"; 

$result=mysql_query($query); 
$row = mysql_fetch_array($result); 

$image = $row['image']; 
$image_type= $row['image_type']; 

header("Content-type: $image_type"); 
print $image; 

exit; 

?> 

感谢

+0

什么是存储在数据库?怎么样 ? 你知道blob类型限于64k吗? – 2009-05-25 16:48:55

+0

实际图像存储为数据库中的blob 其余数据为varchar。该图像在数据库中显示为[BLOB-64.0 KiB] – Elliott 2009-05-25 16:50:54

+0

图片是否上传并存储在小于64K的db中? 图像类型是正确的MIME类型,如图像/ PNG或图像/ JPEG? – 2009-05-25 17:03:11

回答

3

那么这里是一个简短的答案。

<?php 
include '../connection.php'; 
$id = (int)$_GET['id']; 
$query = "SELECT * FROM `images` WHERE `image_id` = '$id'"; 

$result=mysql_query($query); 
$row = mysql_fetch_array($result); 

$image = $row['image']; 
$image_type= $row['image_type']; 
$size = $row['image_size']; 
//alternative 
/* list($image, $image_type, $size) = array(
             $row['image'], 
             $row['image_type'], 
             $row['image_size'] 
            ); 
*/ 
$ext = explode('/', $image_type); 
$name = $id . '.' . $ext[1]; 

header("Content-type: $image_type"); 
header("Content-length: $size"); 
header("Content-Disposition: attachment; filename=$name"); 

print $image;  
exit; 

检查blobtype是它能够将数据存储多达16M

+0

我已经添加了它们,并且将它更改为MEDIUMBLOB,但仍然一样。 – Elliott 2009-05-25 17:02:05

+1

Content-Dispostion标题只能用于下载。它不应该用于发送标记的图像。 – 2009-05-25 17:03:44

+0

我删除那..因为在FF它试图下载文件。 – Elliott 2009-05-25 17:08:18

0

这看起来似乎是工作,什么错?

尝试明确指定字段:

SELECT image, image_type FROM ... 

当您从数据库中查询,会发生什么?

你喜欢加载图像:

<img src="image.php?id=12"> 

或者你加载PHP作为自己的页面?

+0

我将图像加载到它自己的页面上 ,比如view_image.php?id = 2 我从查询中没有发现错误,但在Firefox中运行我得到页面中显示的URL。但在IE浏览器中,我得到一个带红叉的图片框? – Elliott 2009-05-25 17:00:53

+0

尝试删除“退出”? – Andomar 2009-05-25 17:06:14

0

夫妇的事情,试图

  1. 或许真的是失败的最小MEDIUMBLOB和它返回一个错误味精在html而不是预期的图像

  2. 是正确存储在数据库中的content_type或您是否只存储图像的文件扩展名Ë

内容类型应该是这个样子

image/gif 
image/jpeg 
+0

图像类型在数据库中显示为“image/pjpeg” – Elliott 2009-05-25 16:57:51

0

也许你可以尝试

$row = mysql_fetch_assoc($result); 

代替

$row = mysql_fetch_array($result); 
+0

我认为默认情况下,mysql_fetch_array将存储数字和名称,所以$ row [0]和$ row ['columnname']是有效的 – Andomar 2009-05-25 17:05:30

+0

你学习东西新的每一天:) – bumperbox 2009-05-25 17:09:57

1

要调试这个问题,我想建议注释掉Content-type标题行,然后敲击t他直接在浏览器中访问网址。这将允许您查看PHP可能发出的任何错误,警告或通知。

0

您在评论中说过表格最初表示“[BLOB - 64.0 KiB]”,但是您之后将其更改为“MEDIUMBLOB”。这将扩大您可以存储的大小,但是所有现有数据仍将被截断为64KiB。

请确保您使用的字段类型足够大以存储要存储的数据(16MB在MEDIUMBLOB中,或〜4GB在LONGBLOB中,我确定),然后重新插入所有数据。

除了上面提到的安全问题,我不明白为什么代码不能工作,除了数据库问题。

+0

我已经做了这一点,并重新上传了一张图片,现在显示为 [BLOB - 369.9 KiB] – Elliott 2009-05-25 17:45:35

+0

当您访问它时,它在页面上显示正确吗? (在原始问题中使用代码)。我试过这个确切的代码,它似乎工作正常(使用jpeg,而不是pjpeg虽然) – Drakia 2009-05-25 19:08:40

+0

谢谢,但没有它没有工作。 – Elliott 2009-05-25 21:50:58

0

或者,如果你不想创建一个单独的PHP文件,可以内嵌它

<?php 
// retrieve blob into $img 
?><img src='data:image/png;base64,<?php echo base64_encode($img);?>' alt='Image <?php echo $id;?>'>