如何将图像输入mysqli?

时间:2016-06-24 21:28:57

标签: php mysqli

我不太确定如何在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;
        }
    }
?>

我如何检索信息

2 个答案:

答案 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;