我不太确定如何在PHP中处理图像以将其放入MYSQLI中的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 [&#39; cf&#39;];然后我将其添加到查询中。我也试过$ var = $ _FILES [&#39; cf&#39;];但它不会处理。我需要做些什么才能让它正确发送/处理?
根据回答进行修改
我将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);
?>
现在我看到Query成功,但是没有任何内容进入数据库。
编辑 - 添加了检索文件
<?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;
}
}
?>
我如何检索信息
答案 0 :(得分:0)
当你调用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的任何其他内容都不应单独信任。
答案 1 :(得分:0)
如果您不必坚持在数据库中保存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.")");
注意我在插入中添加了一个mimetype,因为您需要它才能在以后正确显示文件。
然后,当您想要显示它时,只需从数据库中提取内容并将其与正确的标题一起回显。
header('Content-type:'.$mime_type);
echo $content;