通过php将图像添加到数据库

时间:2014-04-20 04:18:16

标签: php

我无法让我的代码与我的数据库一起使用。我几乎可以肯定它只是标点符号,因为我们教授给我们的视频太小了。我使用blob类型,图像小于1mb。这就是我所拥有的,它只是我试图放入数据库中的最后几个项目。它告诉我,我不能使用空值。这些是我得到的错误:

警告:fopen()[function.fopen]:第100行/home/wequpstu/public_html/admin/portfolioForm.php中的文件名不能为空

警告:fread()要求参数1为资源,布线在第101行的/home/wequpstu/public_html/admin/portfolioForm.php中给出

警告:fclose()要求参数1为资源,第102行/home/wequpstu/public_html/admin/portfolioForm.php中给出布尔值

$handle = fopen($_FILES['imgPhoto']['tmpName'], "r");
        $image = fread($handle, filesize($_FILES['imgPhoto']['tmpName']));
        fclose($handle);

        $image = mysqli_real_escape_string($dbConnection, $image);
        mysqli_query($dbConnection, "INSERT INTO portfolio (title, shortDescription,     longDescription, image, imageName, imageType, imageSize) VALUES ('$_POST[txtTitle]', '$_POST[txtShortDescription]', '$_POST[txtLongDescription]', '$image', '" . $_FILES['imgPhoto']['name'] ." ',  ' " . $_FILES['imgPhoto']['type']. " ',  '" . $_FILES['imgPhoto']['size']."'  )");

        echo "<p style=\"text-align: center; font-size: 11px;\">Thanks for filling out form!</p>";
        echo "</fieldset></form>" ;

1 个答案:

答案 0 :(得分:1)

您的代码可能导致问题的几个问题如下:

  • 在插入之前不要逃避二进制数据
  • 将上传中的二进制数据插入数据库是一个巨大的禁忌。这可能会无意中导致对您的服务器的一些非常恶意的攻击,而不仅仅是简单的SQL注入。

话虽这么说,但不知道您要存储的字段类型是什么,也不知道图像文件有多大。将2GB上传存储为数据库中的字段可能不是一个明智的想法,但如果您想存储大图像,建议将数据流式传输到BLOB字段。

对于较小的文件,如果分配了足够的空间,您可以base64_encode将它们安全地放入TEXT字段或VARCHAR。在回读数据时,您可以使用base64_decode,或者只是在页面中显示图像,您可以像这样插入:

// get the base64 data from the database field named 'image'
$image = $row['image'];

// echo out an image tag containing the base64 encoded image. no decoding required
echo '<img src="data:image/png;base64,' . $image . '">';

另一种策略是你可以使用bin2hex()将二进制数据转换为十六进制,然后存储它。从数据库中读回时,您可以使用hex2bin()

为了帮助确定哪种方法最适合您,您应该read this article that explains when to use base64hex2binbin2hex方法与base64方法没有相同的限制,因此它们更适合编码非常大的二进制数据。