使用php和显示将图像存储到mysql DB中

时间:2013-03-16 17:34:22

标签: php mysql image jpeg

在我的mysql数据库中显示图像时遇到大问题

我将它存储在longblob类型

当显示图像时,我得到一个损坏的图像图标

这里是存储图像的代码

if(isset($_FILES['image']) && $_FILES['image']['size'] > 0 && isset($_POST['photoName']))
{
    //temporary file name
    // Temporary file name stored on the server
    $tmpName = $_FILES['image']['tmp_name'];
    $imageType = $_FILES['image']['type'];

    // Read the file
    $fp = fopen($tmpName, 'r');
    $data = fread($fp, filesize($tmpName));
    $data = addslashes($data);
    fclose($fp);


    $sql="INSERT INTO photos (photoName, caption, photoData, photoType, userName)
        VALUES
        ('$_POST[photoName]','$_POST[caption]','$tmpName','$imageType', '$currentUser')";

    //For debugging purposes
    if(!mysqli_query($con,$sql))
    {
        die('Error: ' . mysqli_error($con));
    }
    else
    {
        echo "Your Image has been Added";
    }   
}

然后打印图像

if(isset($_POST['usersImage'])){
        //code to show images
        $user = $_POST['usersImage'];
        $sql = "SELECT * FROM `photos` WHERE userName = '$user'";
        $result = mysqli_query($con,$sql);
        while($row = mysqli_fetch_array($result)) 
        {
            switch ($row['photoType']) {
                case 'image/jpeg':

                echo "<tr>";  
                echo '<img src="data:image/jpeg;base64,'. base64_encode($row['photoData'])."\"></td>";   
                echo "</tr>"; 
                    //echo '<img src="image>' .$row['photoData']. '.jpeg'.'</p>';
                    //echo '<p id="caption">'.$row['caption'].' </p>';
                break;
            }           
        }
    }

你可以看到我最近的尝试是使用base64编码打印出图像 我以前的尝试是注释掉的代码

2 个答案:

答案 0 :(得分:3)

当您显示图像时,它必须来自其自己的请求。 src=""应包含脚本的网址,该脚本将使用正确的MIME标头image/jpeg传送内容。

<?php
    $photo_bin = //binary data from query here;

    header("Content-Type: image/jpeg"); // or whatever the correct content type is.
    echo $photo_bin;

浏览器可以从img标记请求的PHP脚本的快速示例。

答案 1 :(得分:1)

验证很重要。您正在为自己打开这么多安全问题。

永远不要在sql语句中使用$ _POST / $ _GET。逃避它们,更好的是,使用PDO语句。验证图像实际上是图像,此时,您可以在表格中输入任何类型的文件。

正如您所发现的,在数据​​库中存储图像比在文件系统上存储图像要困难得多。通常,将文件存储在文件系统上的参数远远多于在表格内部存储的参数。

快速查看插入代码,我不太清楚为什么要在二进制数据中添加斜杠。删除对addslahes的调用,然后尝试。