我不太确定如何在PHP中处理图像以将其放入mysql中的blob类型。这是我到目前为止的代码…
<?php
$servername = ""; //Taken out for stack overflow question
$username = ""; //Taken out for stack overflow question
$password = ""; //Taken out for stack overflow question
$dbname = ""; //Taken out for stack overflow question
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn)
{
echo 'Could not connect';
}
else
{
if (!empty($_FILES['cf'] && $_POST['category']))
{
$file = $conn->real_escape_string($_FILES['cf']['tmp_name']);
mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")");
}
else
{
echo 'Empty file';
}
}
mysqli_close($conn);
?>
现在图像的值不为空,因此图像被处理。但我似乎无法处理它。通常我创建一个变量$var = $_POST['cf'];然后将其添加到查询中。我还尝试了$var = $_FILES['cf'];但它不会处理。我还需要做些什么来使它正确发送/处理吗?
基于答案编辑
我把PHP改成了类似于答案的东西
<?php
$servername = ""; //Taken out for stack overflow question
$username = ""; //Taken out for stack overflow question
$password = ""; //Taken out for stack overflow question
$dbname = ""; //Taken out for stack overflow question
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn)
{
echo 'Could not connect';
}
else
{
if (!empty($_FILES['cf'] && $_POST['category']))
{
try
{
$file = $conn->real_escape_string($_FILES['cf']['tmp_name']);
$filecontents = File_Get_Contents($file);
$filecontentssafe = $conn->real_escape_string($filecontents);
mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")");
echo 'Query successful';
}
catch(Exception $e)
{
echo 'Could not perform action' + $e;
}
}
else
{
echo 'Empty file';
}
}
mysqli_close($conn);
?>
现在我看到查询成功,但是…没有东西进入数据库。
编辑添加检索文件
<?php
$servername = "";
$username = "";
$passcode = "";
$dbname = "";
$conn = mysqli_connect($servername, $username, $passcode, $dbname);
if (!$conn)
{
echo 'Could not connect';
}
else
{
try
{
$sql_query = mysqli_query($conn, "SELECT * FROM `adDatabase`");
while ($row = mysqli_fetch_array($sql_query))
{
$id = $row['ID'];
$img = $row['img'];
$image = '<img src="data:image/png;base64,'.base64_encode( $row['food'] ).'" style="height: 12em; width: 12em; margin: 1em; padding: 0.9em; " >';
echo $image;
}
}
catch(Exception $e)
{
echo $e;
}
}
?>
如何检索信息
当你调用mysql时,$file只包含一个临时上传文件的路径,而不是你想要的数据。
如果您希望MySQL查看文件的路径,并将其内容直接加载到数据库中,请查看MySQL函数LOAD_FILE(): http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_load-file
否则,如果您希望在PHP中执行此操作,则需要将文件的内容放入一个类似
的变量中。$file_contents=File_Get_Contents($file);
…然后使用
$file_contents_safe=$conn->real_escape_string($file_contents);
在$file_contents_safe插入数据库之前。有些人还喜欢Base64编码。
编辑:正如其他人建议的那样,也请记住注入漏洞。临时文件的名称以及从post/apache传入的任何其他内容本身都不应该被信任。
如果您不必坚持在数据库中保存blob内容,那么您可以只在数据库中保存文件名,并将常规文件上传到选定的位置。为此,您需要在向数据库
中添加内容之前添加这个。$tmp_name = $_FILES["filename"]["tmp_name"];
$name = $_FILES["filename"]["name"];
move_uploaded_file($tmp_name, "YOUR_UPLOAD_DIR/{$name}");
上传文件后,您只需要在数据库中存储它的名称,而不是存储blob内容。在显示时,您只需要访问上传文件夹中的实际文件并显示它。这是一个更简洁的解决方案,特别是如果您不需要在服务器之间迁移文件。
整个代码看起来像这样:
if (!empty($_FILES['cf'] && $_POST['category']))
{
$tmp_name = $_FILES["cf"]["tmp_name"];
$name = $_FILES["cf"]["name"];
move_uploaded_file($tmp_name, "YOUR_UPLOAD_DIR/{$name}");
$file = $conn->real_escape_string($name);
mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")");
}
然后在访问它时,您需要从数据库中提取数据并显示它。如果是图像,可以是
<img src="<?php YOUR_UPLOAD_DIR.'/'.$name ?>"/>
否则:
在数据库中插入图像数据:
$content = file_get_contents($tmpName);
$file = $conn->real_escape_string($content);
$mime_type = mime_content_type($tmpName);
mysqli_query($conn, "INSERT INTO adDatabase(".$category.", mime_type) VALUES(".$file.", ".$mime_type.")");
注意,我在插入中添加了一个mime类型,因为您将需要它,以便稍后能够正确显示文件。
然后,当您想要显示它时,只需从db中提取内容并将其与适当的标题一起回显即可。
header('Content-type:'.$mime_type);
echo $content;