我从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一样存储到表格中......
提前致谢! 丹尼斯
答案 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>";
?>
但正如马丁所说,将图像存储在文件系统中并将路径放入数据库中是个好主意。