2012-03-10 71 views
3

我是从一些教程阅读如何我的图片上传到数据库二进制而不是把他们的服务器本身上拉BLOB的图像数据,以及我得到它像这样工作:从MySQL在PHP

PHP:

$image = chunk_split(base64_encode(file_get_contents($tmpfile))); 
    mysql_query("INSERT INTO images (`img_location`, `caption`, `user`, `genre`, `when`) VALUES ('$image', '$caption', '$id', '$genre', '$when')"); 

我的问题是怎么做的,你现在可以从数据库中提取它,我读过这样做的几种方法,尝试所有这些,也无法弄明白,我没有得到一个MySQL错误,这里是我如何尝试它:

$get_pics = mysql_query("SELECT * FROM images WHERE user='$id' "); 
while($get_pics2 = mysql_fetch_array($get_pics)) 
{ 
$sixfour_enc = base64_decode($get_pics2['img_location']); 

$new .= "<img src=\"".$sixfour_enc."\" >"; 
} 

This works ... kind of,发生了什么事是它打印出IMG标记中的原始二进制文件。

我如何得到这个再编译成一个可读的图像?另外,是在图像存储在数据库愚蠢?我应该做我平常做的事,并将它们存储在服务器上?

谢谢 -Mike

回答

6

您可以在数据库中存储的图像,如果你想(虽然有没有错,只是将其存储为文件要么,选择任何在你的情况是合适的),但存储原始二进制数据在一个BLOB(即不用base64编码)。您可以直接在您的查询中嵌入您从file_get_contents获得的二进制数据,只要您首先使用正确的转义函数(您的案例中为mysql_real_escape_string)即可。

对于图像的输出,你可以做你现在正在做的方式,但你必须将它输出base64编码,并用data URI方案是这样的:

echo '<img alt="embedded image" src="data:image/png;base64,' . chunk_split(base64_encode($get_pics2['img_location'])) . '">'; 

请注意,嵌入式图像数据有一些优缺点。要注意的一些重要的缺点是base64编码的严重开销(比原来大33%左右)和潜在的缓存问题。

+0

这是完全有道理的,在回顾性能打击之后,我回到了原来的做事方式,但我只是抛出这个看看它是否有效,而且做得非常好!谢谢你,先生! – user1053263 2012-03-10 11:49:54

2

如果您没有任何特别的理由将图像数据存储在您的数据库中,那么我强烈建议您按正常方式进行操作。

这是因为,您的数据库引擎将会受到显着的性能影响,因为您将获取并放置超过必要的数据。

此外,MySQL表上的BLOB字段在大小方面远远大于其他表,并且在大多数情况下执行速度较慢。

只要想想你的服务器的开销,一旦你实现这个让我寒战。 ;)

我想这一切归结为可扩展性。一旦你的数据库填满了,你的服务器的响应速度就会变慢,最终会变成一个真正的猪。您的下一个选择是增加服务器RAM或修改代码以适应更大的负载。

只是我2美分,希望这有助于!

祝你好运!

+0

是的,我打算按常规方式来做。我正在尝试一些新的东西,看看它是如何工作的,但后来我意识到我的数据库会有多沉重。我在想,如果这样做会更安全,也许更容易做到这一点,但最有可能的就像你说的那样,会有巨大的表现。谢谢! – user1053263 2012-03-10 11:48:35

+1

不用担心,只是在这里帮助! :) – optimum 2012-03-10 11:57:50

0

其实,最好的办法是有一个PHP脚本来输出图像的二进制文件与适当的标题(说getimage。PHP)和用于生成HTML的脚本将有一个这样的代码:

$get_pics = mysql_query("SELECT id FROM images WHERE user='$userid' "); 
while($imglist = mysql_fetch_array($get_pics)) 
{ 
    $new .= '<img src="getimage.php?id='.$imglist['id'].'" title="'.$imglist['caption'].'" />'; 
} 

所以HTML将看起来像:

<img src="getimage.php?id=12345" title="the caption of" /> 

你必须有一个主键(为什么没有? )在桌上images,比方说id

的“getimage.php”脚本应提取二进制输出的内容(假设场img_location包含图像的实际内容:

<?php 
// this will output the RAW content of an image with proper headers 
$id=(int)$_GET['id']; 

$get_img = @mysql_fetch_assoc(@mysql_query("SELECT img_location FROM images WHERE id='$id' ")); 

$image = imagecreatefromstring(base64_decode($get_img['img_location'])); 
if ($image){ 
    //you may apply here any transformations on the $image resource 
    header("Content-Type: image/jpeg"); //OR gif, png, whatever 
    imagejpeg($image,null,75);   //OR imagegif, imagepng, whatever, see PHP doc. 
    imagedestroy($image);    //dump the resource from memory 
} 
exit(); 
@mysql_close(); 
?> 

这种方法会给你的灵活性。 但是,您可能需要检查并清理变量,并选择另一种连接到MySQL的方法,如MYSQLi或PDO。 另一个好主意是使用预准备语句来防止SQL注入