将图像上传到数据库的正确方法

时间:2009-06-26 05:48:04

标签: php database blob

我知道你们中的一些人会说这不是正确的方法,但我在一个紧迫的截止日期前完成一个应用程序,截至目前我无法返回并修改代码以将图像存储在目录中。

现在已经清除了

我的问题是我通过输入一个图像将数据插入数据库。

(不介意类安全调用,如果数据有效,那么所做的就是进行一些检查)

$filename = $security->secure($_FILES['imgschool']['name']);
$tmpname = $security->secure($_FILES['imgschool']['tmp_name']);
$imgsize = $security->secure($_FILES['imgschool']['size']);
$imgtype = $security->secure($_FILES['imgschool']['type']);
$school = $security->secure($_POST['school']);


//begin upload
if($imgsize > 0) {
$handle = fopen($tmpname, "r");
$content = fread($handle, filesize($tmpname));
$content = addslashes($content);

//code to add all this to database
}

变量$ content是图像,它的所有内容都是addslashes。我记得有人曾经提到用base64这样的东西来做这件事,但我几乎不记得是怎么写的。

这就是我从数据库中调用图像的方式

除了所有的查询和诸如此类的东西之外 这是调用图像的主要部分

header("Content-length: ".$imgsize);
header("Content-type: ".$imgtype);
header("Content-Disposition: attachment; filename=".$imgname);
print $row['img'];

我遇到的问题是代替图像显示。网址只显示,所以在这种情况下我只看到这个

http://localhost/admin/school-catalog.php?page=gallery&id=4

打开页面以查看在网址中设置了正确参数的图像。


对于那些想要查看正在执行的查询来保存图像等等 我复制了整个部分

//save image to db
if(isset($_POST['btnupload'])) {

$filename = $security->secure($_FILES['imgschool']['name']);
$tmpname = $security->secure($_FILES['imgschool']['tmp_name']);
$imgsize = $security->secure($_FILES['imgschool']['size']);
$imgtype = $security->secure($_FILES['imgschool']['type']);
$school = $security->secure($_POST['school']);


//begin upload
if($imgsize > 0) {
$handle = fopen($tmpname, "r");
$content = fread($handle, filesize($tmpname));
$content = base64_encode($content);
}

$save = mysql_query("insert into tbl_schoolgallery(id,hash,img,imgtype,imgsize) values(null,'$school','$content','$imgtype','$imgsize')") or die(mysql_error());
header("Location: school-catalog.php?page=school_gallery");

}


//call image from db
$query = mysql_query("select * from $tbl where id = '$id'") or die(mysql_error());
while($row = mysql_fetch_assoc($query)) {

$imgtypeget = explode("/", $row['imgtype']);

$imgname = "img.".$imgtypeget[1];
$imgtype = $row['imgtype'];
$imgsize = $row['imgsize'];

header("Content-length: ".$imgsize);
header("Content-type: ".$imgtype);
print base64_decode($row['img']);

print $row['img'];
}

1 个答案:

答案 0 :(得分:7)

使用addslashes非常不正确。根据您的列是TEXT字段还是BLOB字段,您应该使用Base64或mysql_real_escape_string

使用Base64并不难;你也可以这样使用。只需将addslashes替换为base64_encode,然后使用base64_decode回显图像。

有一种更简单的方式来编写整个事情,就此而言:

// begin upload
if ($imgsize > 0)
{
  $content = file_get_content($tmpname);
  $content = base64_encode($content);
}

然后输出你真的只需要做

header("Content-type: ".$imgtype);
echo base64_decode($img);

但是,如果列是BLOB,则可以直接使用mysql_real_escape_string

// begin upload
if ($imgsize > 0)
{
  $content = file_get_content($tmpname);
  $content = mysql_real_escape_string($content);
}

然后:

header("Content-type: ".$imgtype);
echo $img;

虽然根据您当前的症状判断,我猜你也有一个关于如何从数据库中存储和调用图像的错误,我需要查看代码的哪一部分进行查询在我帮助你修复那个部分之前插入和读取数据库。


您当前的代码似乎很好。一些问题:

print base64_decode($row['img']);

print $row['img'];

你可能想要摆脱第二排。此外,您应该使用echo代替print;每个人都使用它,有时可能会稍快一些,print除了返回值之外没有其他任何好处:

echo base64_decode($row['img']);

$security->secure()似乎是某种消毒功能。只需使用mysql_real_escape_string() - 那就是你应该使用的那个。 $imgsize除外;你可能想在那个上使用intval(),因为你知道它应该是一个整数。

同样在这里:

$query = mysql_query("select * from $tbl where id = '$id'") or die(mysql_error());

您将表tbl_schoolgallery命名为上面几行。我假设$tbl == 'tbl_schoolgallery',但为了保持一致性,您应该在两个地方使用$tbl或在两个地方使用tbl_schoolgallery

此外,将while替换为if - 无论如何,如果代码多次循环,您的代码会造成麻烦。