0

从我的 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 编码来打印图像我之前的尝试是注释掉的代码

4

2 回答 2

3

当您显示图像时,它必须来自它自己的请求。src=""应该包含一个脚本的 URL,该脚本将使用正确的 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 脚本的快速示例^。

于 2013-03-16T17:41:35.317 回答
1

验证很重要。您正在向如此多的安全问题敞开心扉。

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

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

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

于 2013-03-16T17:44:28.680 回答