上传在MySQL中存储图像

时间:2014-04-11 18:32:24

标签: php html mysqli

我正在尝试上传并将图像存储在MySQL中,出于某种原因,我在提交照片时收到了破损的照片。我认为$ image = $ image-> fetch_object()存在问题;当我点击破碎的照片时,我收到以下错误消息:致命错误:在非对象上调用成员函数fetch_object()任何建议如何解决此问题

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Upload an Image</title>
    </head>
    <body>
        <form action="index.php" method="POST" enctype="multipart/form-data">
            File: 
            <input type="file" name='image'/> <input type="submit" value="submit">
        </form>

        <?php
        //connect to database
        try{
            $db = new mysqli('','','','');

        }catch(Exception $e){
            echo $e->getMessage();
        }

        if(isset($_FILES['image'])){
            $file = $_FILES['image']['tmp_name'];//['tmp_name'] is the temporary location 
        }

        if(!isset($file)){
            echo 'please select an image';
        }else{
            $image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
            $image_name = $_FILES['image']['name'];
            $image_size = getimagesize($_FILES['image']['tmp_name']);


            if($image_size == false){
                echo 'thats not an image';
            }else{

                $insert = $db->prepare("INSERT INTO store VALUES (?, ?, ?)");
                $insert->bind_param('bsi', $image, $image_name, $image_size);
                if(!$insert->execute()){
                    echo "Problem uploading file";
                    }else{
                    printf("%d Row inserted.\n", $insert->affected_rows);
                    echo $lastid = $db->insert_id;//returns the last id that was inserted 
                    echo 'image uploaded.<p/> Your Image:<p/><img src=get.php?id=$lastid>';
                }
            }
        }
        ?>
    </body>
</html>

这是更新后的代码,我不再收到错误,但图片仍然没有损坏     的getMessage();     }

$id = $_REQUEST['id'];//request because we going to use it inside an image tag

$image = $db->prepare("SELECT * FROM store WHERE id=?");
$image->bind_param('s',$id);
if($image->execute()){    
    $image = $image->fetch();
}

$image = $image->image;
header('Content-type: image/jpeg');

echo $image;

?>

2 个答案:

答案 0 :(得分:3)

对不起,我错过了重点。

以下代码无效:

$image = $db->query('SELECT * FROM store WHERE id=$id');
$image = $image->fetch_object();
不会评估第一个语句中的

$ id,因为它是单引号中的字符串。

图像损坏的原因可能是使用addslashes()来屏蔽输入,即二进制数据。我会使用带参数的预准备语句并绑定输入数据。


旧答案

PHP-manual说(http://www.php.net/manual/en/features.file-upload.post-method.php):

  

默认情况下,文件将存储在服务器的默认临时文件中   目录,除非已经给出了另一个位置   php.ini中的upload_tmp_dir指令。

     

[...]

     

无论逻辑如何,您都应该从中删除文件   临时目录或将其移动到其他地方。

     

[...]

在使用之前,您应该使用move_uploaded_file()移动上传的文件。我也不鼓励在数据库中存储图像......

答案 1 :(得分:1)

您的保存脚本:

 if(!$_FILES['image']['tmp_name']){
     $image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
     $image_name = addslashes($_FILES['image']['name']);
     $image_size = getimagesize($_FILES['image']['tmp_name']);
     if(!$insert = $db->query("INSERT INTO store (name,image) VALUES('{$image_name}','{$image}')")){
         echo "Problem uploading file";
     }else{
         echo $lastid = $db->insert_id;//returns the last id that was inserted 
         echo 'image uploaded.<p/> Your Image:<p/><img src='data:image/png;base64,<?=$image;?>';
     }
 }

这样当您需要图像时,您可以从数据库中获取数据并重新使用它。