2014-02-19 226 views
1

我已经做了一个php页面,您可以上传将保存在我的数据库中的图像/文件作为类型“mediumblob”。现在我陷入困境,无法弄清楚如何从数据库中显示这些图像。我用大写字母打印了图像。PHP/MySQL - 从blob显示图像

<?php 
$dbLink = new mysqli('127.0.0.1', 'root', '', 'test'); 
if(mysqli_connect_errno()) { 
die("MySQL connection failed: ". mysqli_connect_error()); 
} 

$sql = 'SELECT `id`, `name`, `mime`, `size`, `created`, `data` FROM `file`'; 
$result = $dbLink->query($sql); 

if($result) { 
// Kolla om det finns några filer i databasen 
if($result->num_rows == 0) { 
echo '<p>There are no files in the database</p>'; 
} 
else { 

echo '<table width="100%"> 
<tr> 
<td><b>Name</b></td> 
<td><b>Mime/type</b></td> 
<td><b>Size (bytes)</b></td> 
<td><b>Created</b></td> 
<td><b>Image</b></td> 
</tr>'; 

while($row = $result->fetch_assoc()) { 
echo " 
<tr> 
<td>{$row['name']}</td> 
<td>{$row['mime']}</td> 
<td>{$row['size']}</td> 
<td>{$row['created']}</td> 
//THIS IS WHERE I'M SUPPOSED TO PRINT OUT THE IMAGES 
</tr>"; 
} 



echo '</table>'; 
} 
} 

else 
{ 
echo 'Error! SQL query failed:'; 
echo "<pre>{$dbLink->error}</pre>"; 
} 
echo '<p>Click <a href="index.html">here</a> to go back</p>'; 
// Close the mysql connection 
$dbLink->close(); 
?> 

这是我在数据库表:

CREATE TABLE `file` (
`id` Int Unsigned Not Null Auto_Increment, 
`name` VarChar(255) Not Null Default 'Untitled.txt', 
`mime` VarChar(50) Not Null Default 'text/plain', 
`size` BigInt Unsigned Not Null Default 0, 
`data` MediumBlob Not Null, 
`created` DateTime Not Null, 
PRIMARY KEY (`id`) 
) 

非常感谢您的帮助!

+0

那么首先,{$ row ['data']}打印什么? – berentrom

+0

整个页面只是充满了这样的符号: PNGIHDR; bKGD IDATx y – user3327442

+1

我建议避免图像/文件存储在db.try中上传并保存在folders.now你认为图像/文件的大小很小,但在未来的数据库大小将极其高....... –

回答

0

试试这个;

header('Pragma: public'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-length: '.$row['size']); 
header('Content-Type: '.$row['mime']); 
header('Content-Disposition: attachment; filename='.$row['name']); 
echo '<img src="'.$row['data'].'" />'; 
+0

为什么img标签? – EJTH

1

如果BLOB包含图像的二进制数据,所以您需要获取内容并将其写入文件,从而生成图像。

file_put_contents($path."path/to/image/".$row['name'], base64_decode($row['image'])); 

然后正常地调用它。当然..在写它之前检查文件是否存在:)

或者,你可以编写一个脚本来直接输出图像,如下所示。

+0

@BillyBigPotatoes这篇文章已经解决了这个问题,更不用说,出于性能的考虑,你是否总是希望从数据库加载图像或缓存它? – bear

1

这样做有两种方法:

您可以使用内联base64编码。你可以做这样假设你的图像是JPEG:

echo '<td><img src="data:image/jpeg;base64,'.base64_encode($image);.' /></td>'; 

下一个选项将是创建一个名为image.php一个PHP文件,是以图像的ID作为参数,然后输出图像。您的HTML将如下所示:

<td><img src="image.php?id={$row['id']}"></td> 

无论如何,在这个问题上有许多回答的主题。你可以看看这个例子: I need my PHP page to show my BLOB image from mysql database