在mySQL数据库中存储图像的问题

时间:2011-12-30 22:29:37

标签: php mysql sql image blob

**解决**
我的代码有点问题

我必须使用php和HTML表单将图像存储到mysql数据库中。 我已经按照指南,但我没有真正的工作。它将文件上传到服务器......然后它被放弃......至少没有存储。

代码......文本和变量的语言是......荷兰语,如果你有问题那部分我很乐意帮忙。

目标表的数据库布局是:

Fotos

fotonr        int(10)                       Index number
album         varchar(20)                   Grouping catagory(not needed)
Lid           int(4)                        Index number of the member that placed it
type          varchar(20)                   To store what kind of image it is
image         blob                          The image itself

为此我使用以下段(数据库链接不在文件中,之前已经构建)

<p>
<?php
$target_path= "images/";
echo "checking file upload!<br />";
if(isset($_FILES['file']))
{
    echo"SET!!!<br />";
    if(isset($_POST['album']))
    {
        $album=trim($_POST['album']);
        if($album!="")
        {
            $album=  stripslashes($album);
        }
        else $album="Niet Ingedeeld/";
    }
    else $album="Niet Ingedeeld/";
    $myalbum=mysql_real_escape_string($album);
    $target_path=$target_path.$album;
    foreach($_FILES['file']['tmp_name'] as $key=>$afbeelding)
    {
        echo $_FILES['file']['name'][$key]."<br />";

        if ($_FILES['file']['tmp_name'][$key]!=''){
        $size = getimagesize($_FILES['file']['tmp_name'][$key]);
        $width=$size[0];
        $height=$size[1];
        echo "groote: ".$width."x".$height."<br />";
        if($width>800&&$height>600)
        {
            echo "Uw afbeelding is te groot!(maximaal 800x600)<br />";
        }
        else
        {

            $mynr= mysql_real_escape_string($_SESSION['nummer']);
            /*$type=exif_imagetype($_FILES['file']['tmp_name'][$key]);*/
            $type=$size[mime];
            echo 'Het type was:'.$type.'<br /> ';
            if($type=="image/gif" ||$type=="image/jpeg" ||$type=="image/bmp" ||$type=="image/png" ||$type=="image/gif" ){
            $mytype =mysql_real_escape_string($type);
            $tmpName  = $_FILES['file']['tmp_name'][$key];

            /*$fp      = fopen($tmpName, 'r');
            $content = fread($fp, filesize($tmpName));
            $mycontent = mysql_real_escape_string($content);*/
            $content = file_get_contents($tmpName); 
            $data = unpack("H*hex", $content ); 
            $mycontent = '0x'.$data['hex']; 


            $sql="INSERT INTO`nacverk`.`Foto` (`album` , `lid` ,`image`,`type` )VALUES ('$myalbum' ,'$mynr','$mycontent', '$mytype')";

            $result=mysql_query($sql); 
            /*fclose($fp);*/
            if(!$result)
            {
                echo "<h1>Bestand uploaden mislukt!<br /> ".mysql_error()."<br /></h1>";
            }
            else
            {
                echo "<h1>Bestand Succesvol geupload!<br /></h1>";
            }
            }
            else{
                echo "<h1> NOD32 detected a viral intrusion!<br /></h1>";
            }

        }

    }}
}
mysql_query("OPTIMIZETABLE `Foto` ");
?>
</p><hr />
<h3> Upload hier uw Foto's!</h3>
<hr />
<p>
<form enctype="multipart/form-data" action="" method="post" name="foto-upload">
<input name="MAX_FILE_SIZE" value="10485760" type="hidden">
Uw afbeeldingen:<br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
<input name="file[]"  type="file"><br />
Het album waar ze aan toegevoegd moeten worden:<br />
<input name="album" type="text" maxlength="20"
<?php if(isset($_GET['album']))echo ' value="'.$_GET['album'].'" '; ?>><br />
<input value="Submit" type="submit">
</form>
</p>
<hr />

直到它需要上传到数据库的部分才会落到...中 然后它触发SQL错误说:查询为空。

谢谢你的时间!

5 个答案:

答案 0 :(得分:2)

请记住,BLOB数据类型的最大长度为64KB。图像变大是很常见的,所以也许你应该使用MEDIUMBLOB。

有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/string-type-overview.html

答案 1 :(得分:1)

这是你的问题:

  $fp      = fopen($tmpName, 'r');
  $content = fread($fp, filesize($tmpName));
  $content = addslashes($content);

您将文件内容解释为文本,而不是二进制数据。

您必须以二进制格式将数据提供给mysql服务器。不要添加它。 (多余的?)

(编辑)试试这段代码:

  $content = file_get_contents($tmpName);
  $data = unpack("H*hex", $content );
  $content = '0x'.data['hex'];

答案 2 :(得分:0)

由于我现在无法测试这个,我不是百分百肯定,但我很确定$ _POST ['file []']和$ _FILES ['file []']无效。 $ _POST ['file']和$ _FILES ['file']应该。我假设你有一个像

这样的输入
<input type="file" name="file[]" />

这将允许您上传多个应存储在$ _FILES ['file']中的文件,这些文件本身就是一个数组。 []表示它将是一个多值键,这意味着你需要在PHP站点中以数组的形式访问它。

根据我从您的帖子中了解到您正在学习此内容,所以请允许我建议您不要将图像存储在数据库中,除非您有充分的理由这样做。你不应该这样做的原因有多种,我不想进入这里。您可以在tizag.com http://www.tizag.com/phpT/fileupload.php上找到关于文件上传的体面的旧学校教程。

我希望这会有所帮助。祝你好运,享受:)

答案 3 :(得分:0)

您似乎缺少连接数据库的代码。

$db = mysql_connect("localhost", "mysql_user", "mysql_password");

生成的数据库句柄应作为第二个参数传递给mysql_query

$result = mysql_query($query, $db); 

为了更容易排除故障,请将MySQL错误信息写入网页:

echo "<br>Error " . mysql_errno($db) . ": " . mysql_error($db) . "<br>";

这是我之前用a simple example of how to store an image in MySQL from PHP写的答案。

答案 4 :(得分:0)

为什么不将参考信息存储在服务器上的文件夹和文件夹中。

例如

fotonr        int(10)                       Index number
album         varchar(20)                   Grouping catagory(not needed)
Lid           int(4)                        Index number of the member that placed it
type          varchar(20)                   To store what kind of image it is
image         varchar(64)                   Path to The image itself

这样,如果您需要删除图像,您知道图像的路径并且可以简单地取消链接,访问图像和数据库上的查询会更快,而不会出现blob。