从mysql数据库输出图像(表)

时间:2016-03-10 16:25:50

标签: php mysql

我从mysql数据库(表)

输出图像时遇到问题

我设法将图像存储到表中但是当我尝试输出它时,我会在浏览器中获得一些行代码。

这是我的输出查询:

<?php

      $queri_goals = mysqli_query($conn, "SELECT*FROM goals WHERE user_id = {$user_id}");
      while ($goal=mysqli_fetch_array($queri_goals)) {
        $user_id2 = $goal['user_id'];
        $goalname = $goal['goal'];
        $description = $goal['description']; 
        $deadline = $goal['deadline'];
        $image = $goal['image'];



             echo "<tr>
    <td>$user_id2</a></td>
    <td>$goalname</td>
    <td>$description</td>
    <td>$deadline</td>
    <td>$image</td></tr>";

    } echo "</table>";


?>

输入查询:

   $image =addslashes(file_get_contents($_FILES['goalupload']['tmp_name'])); //$_FILES -> globalna varijabla za filove, u prvu ['ide ime iz forme']['ide koji tip podatka npr name sto je u ovom slucaju upload']
$image_name = addslashes($_FILES['goalupload']['name']);
$image_size = getimagesize($_FILES['goalupload']['tmp_name']);

 //Perform Query
                    mysqli_query($conn, "INSERT INTO goals (user_id, goal, description, deadline, image_name, image) 
                    VALUES('{$user_id}','{$goalname}', '{$description}', '{$deadline}', '{$image_name}', '{$image}')");

                    echo " Your goal is successfully created";  

图像像二进制数据BLOB一样存储到表格中......

提前致谢! 丹尼斯

2 个答案:

答案 0 :(得分:1)

这里有很多东西可以改进。 最明显的是,当您上传图像时,实际上并没有将上传的数据放在文件系统的任何位置。  您确实将图像添加到数据库,但这是非常低效的,您需要将数据存储在MySQL上的BLOB格式列中, 请阅读How to insert a file in MySQL database?

默认情况下,上传的文件存储在服务器上的临时文件夹中,然后在浏览器移动后立即删除。要保存图像,您需要拍摄临时图像并实际定义存储它的位置,然后获取存储它的地点 。请阅读PHP手册上的Handing File Uploads作为此过程的基本入门。

将数据作为原始数据存储在MySQL中是可能的,但是复杂且低效,因为您需要正确存储它,然后当您从数据库调用数据时,您需要为其提供自己的标头,以便浏览器知道如何处理它知道这个数据块是一个JPEG图像文件。

我强烈建议将数据本身存储为文件,并简单地将数据库存储到文件中。

显示BLOB数据:

您需要提供一个标题,告诉浏览器数据采用何种形式,是PNG还是JPEG,还是GIF或HTML文件?等

但是 您的问题是,一旦您已经将输出数据传递给浏览器,就无法为此信息提供PHP标头,所以这是合乎逻辑的步骤是调用一个单独的PHP文件(image.php),它可以获取这些数据并为其提供正确的标题。

所以:

image.php

/**
Assumed you've already Grabbed data fro MySQL in top of this file.
Also assumed file is a JPEG format
**/
header("Content-type: image/jpeg");
print base64_encode($goal['image']);
exit;

然后表格调用此文件:

 echo "<tr>
 <td>$user_id2</a></td>
 <td>$goalname</td>
 <td>$description</td>
 <td>$deadline</td>
 <td>image.php</td></tr>";

然后,image.php文件的行为和行为就像是JPEG图像一样,并按照指示输出图片。 (您需要在想要输出的图像时告诉PHP文件)。

编辑:正如KIMB技术正确指出的那样,您还需要确保image.php文件以正确的编码输出数据。

一些额外的细节:

Addsashes()不合适并且存在安全风险,不应该使用,最好使用PHP手册中引用的mysqli_real_escape_string

  

要转义数据库参数,DBMS特定的转义函数(例如,   mysqli_real_escape_string()for MySQL)应该用于安全性   原因。 DBMS具有标识符的差异转义规范   (例如表名,字段名)而不是参数。

答案 1 :(得分:1)

似乎您将图像的二进制数据输出为字符串,并且不会告诉浏览器它是图像。

您已将图像存储为数据库中的二进制数据,因此您必须先对其进行base64编码,然后将其作为内嵌图像进行回显。

您还必须告诉浏览器图像的MIME类型。 (例如image / png,image / jpg,image / gif)
一种方法是在上载时将MIME类型存储在数据库中。如何使用PHP获取它:

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $temp_path_to_file);
finfo_close($finfo);

现在输出代码:

<?php

      $queri_goals = mysqli_query($conn, "SELECT*FROM goals WHERE user_id = {$user_id}");
      while ($goal=mysqli_fetch_array($queri_goals)) {
        $user_id2 = $goal['user_id'];
        $goalname = $goal['goal'];
        $description = $goal['description']; 
        $deadline = $goal['deadline'];
        $image = $goal['image'];

        //make binary image data to string
        $image = base64_encode( $image );
        //you have to know the mime type of the image
        // e.g. image/png, image/jpg, image/gif
        $mimetype = 'image/png';

             echo "<tr>
    <td>$user_id2</a></td>
    <td>$goalname</td>
    <td>$description</td>
    <td>$deadline</td>
    <td>
         <img src='data:$mimetype;base64,$image'>
     </td></tr>";

    } echo "</table>";

?>

但正如马丁所说,将图像存储在文件系统中并将路径放入数据库中是个好主意。