Php 上传并在MySQL中存储图像

Php 上传并在MySQL中存储图像,php,html,mysqli,Php,Html,Mysqli,我试图上传和存储一个MySQL内的图像,由于某种原因,我得到了一个坏照片时,照片提交。我认为$image=$image->fetch_object()有问题;此外,当我单击损坏的照片时,我会收到以下错误消息:致命错误:对非对象调用成员函数fetch_object()。有没有解决此问题的建议 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="

我试图上传和存储一个MySQL内的图像,由于某种原因,我得到了一个坏照片时,照片提交。我认为$image=$image->fetch_object()有问题;此外,当我单击损坏的照片时,我会收到以下错误消息:致命错误:对非对象调用成员函数fetch_object()。有没有解决此问题的建议

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Upload an Image</title>
    </head>
    <body>
        <form action="index.php" method="POST" enctype="multipart/form-data">
            File: 
            <input type="file" name='image'/> <input type="submit" value="submit">
        </form>

        <?php
        //connect to database
        try{
            $db = new mysqli('','','','');

        }catch(Exception $e){
            echo $e->getMessage();
        }

        if(isset($_FILES['image'])){
            $file = $_FILES['image']['tmp_name'];//['tmp_name'] is the temporary location 
        }

        if(!isset($file)){
            echo 'please select an image';
        }else{
            $image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
            $image_name = $_FILES['image']['name'];
            $image_size = getimagesize($_FILES['image']['tmp_name']);


            if($image_size == false){
                echo 'thats not an image';
            }else{

                $insert = $db->prepare("INSERT INTO store VALUES (?, ?, ?)");
                $insert->bind_param('bsi', $image, $image_name, $image_size);
                if(!$insert->execute()){
                    echo "Problem uploading file";
                    }else{
                    printf("%d Row inserted.\n", $insert->affected_rows);
                    echo $lastid = $db->insert_id;//returns the last id that was inserted 
                    echo 'image uploaded.<p/> Your Image:<p/><img src=get.php?id=$lastid>';
                }
            }
        }
        ?>
    </body>
</html>

对不起,我没有抓住要点

以下代码无法工作:

不会计算第一条语句中的$id,因为它是单引号中的字符串

损坏图像的原因可能是使用addslashes()来屏蔽输入,这是二进制数据。我将使用带有参数的预处理语句并绑定输入数据


旧答案

PHP手册上说():

默认情况下,文件将存储在服务器的默认临时文件夹中 目录,除非已使用 php.ini中的upload_tmp_dir指令

[……]

无论逻辑如何,您都应该从 临时目录或将其移动到其他位置

[……]


在使用上载的文件之前,应使用移动该文件。我也不主张在数据库中存储图像…

对不起,我没有抓住要点

以下代码无法工作:

不会计算第一条语句中的$id,因为它是单引号中的字符串

损坏图像的原因可能是使用addslashes()来屏蔽输入,这是二进制数据。我将使用带有参数的预处理语句并绑定输入数据


旧答案

PHP手册上说():

默认情况下,文件将存储在服务器的默认临时文件夹中 目录,除非已使用 php.ini中的upload_tmp_dir指令

[……]

无论逻辑如何,您都应该从 临时目录或将其移动到其他位置

[……]

在使用上载的文件之前,应使用移动该文件。我也不主张在数据库中存储图像…

您的保存脚本:

 if(!$_FILES['image']['tmp_name']){
     $image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
     $image_name = addslashes($_FILES['image']['name']);
     $image_size = getimagesize($_FILES['image']['tmp_name']);
     if(!$insert = $db->query("INSERT INTO store (name,image) VALUES('{$image_name}','{$image}')")){
         echo "Problem uploading file";
     }else{
         echo $lastid = $db->insert_id;//returns the last id that was inserted 
         echo 'image uploaded.<p/> Your Image:<p/><img src='data:image/png;base64,<?=$image;?>';
     }
 }
if(!$\u文件['image']['tmp\u名称'])){
$image=base64_编码(文件获取内容($_文件['image']['tmp_名称]]);
$image\u name=addslashes($\u文件['image']['name']);
$image\u size=getimagesize($\u文件['image']['tmp\u名称]]);
if(!$insert=$db->query(“插入到存储(名称、图像)值(“{$image\u name}”、“{$image}”)中”){
echo“上传文件时出现问题”;
}否则{
echo$lastid=$db->insert_id;//返回插入的最后一个id
echo“上传图像。

您的图像:

”; } }

这样,当您需要图像时,只需从数据库中获取数据uri并重新使用即可。

您的保存脚本:

 if(!$_FILES['image']['tmp_name']){
     $image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
     $image_name = addslashes($_FILES['image']['name']);
     $image_size = getimagesize($_FILES['image']['tmp_name']);
     if(!$insert = $db->query("INSERT INTO store (name,image) VALUES('{$image_name}','{$image}')")){
         echo "Problem uploading file";
     }else{
         echo $lastid = $db->insert_id;//returns the last id that was inserted 
         echo 'image uploaded.<p/> Your Image:<p/><img src='data:image/png;base64,<?=$image;?>';
     }
 }
if(!$\u文件['image']['tmp\u名称'])){
$image=base64_编码(文件获取内容($_文件['image']['tmp_名称]]);
$image\u name=addslashes($\u文件['image']['name']);
$image\u size=getimagesize($\u文件['image']['tmp\u名称]]);
if(!$insert=$db->query(“插入到存储(名称、图像)值(“{$image\u name}”、“{$image}”)中”){
echo“上传文件时出现问题”;
}否则{
echo$lastid=$db->insert_id;//返回插入的最后一个id
echo“上传图像。

您的图像:

”; } }


这样,当您需要图像时,您可以从数据库中获取数据uri并重新使用它。

问题在于HTML,您必须首先了解HTML,将图像存储在mysql中不是一种糟糕的做法吗?如果我必须这样做,我会将图像的数据uri存储在数据库中,而不是来自文件内容的数据。我知道这不好,但我只是在测试@wackywalrust。问题是HTML,你必须先了解,在mysql中存储图像不是不好的做法吗?如果必须这样做,我会将图像的数据uri存储在数据库中,而不是文件内容中的数据。我知道这很糟糕,但我只是在测试@WackyWalrusI完全同意这一点,但他说他正在测试如何在数据库中保存图像。就我个人而言,我总是将文件移动到服务器上的某个位置。不需要将所有的图像数据都放在数据库中。我用带有参数的prepared语句更新了代码,并绑定了输入数据,现在我没有得到错误,但仍然有一个错误image@KarishKarish您应该能够对脚本的保存部分使用相同的绑定机制。但这还不是全部。上传后,您必须检查图像的类型,以便在请求图像时设置正确的标题。这些图像从来都不是jpeg。@VMai目前我正在上载jpeg文件,所以这不应该是问题所在,您保存这些图像是什么意思script@KarishKarish您已经习惯于转义二进制数据。正如我所说,这可能还不够。请重写保存部分,使其也使用绑定机制。它确保您从数据库中的图像中准确地获取原始数据。损坏的数据不容易修复。最好扔掉所有损坏的图像。我完全同意这一点,但他说他正在测试如何将图像保存到数据库中。就我个人而言,我总是将文件移动到服务器上的某个位置。不需要将所有的图像数据都放在数据库中。我用带有参数的prepared语句更新了代码,并绑定了输入数据,现在我没有得到错误,但仍然有一个错误image@KarishKarish您应该能够对脚本的保存部分使用相同的绑定机制。但这还不是全部。上传后,您必须检查图像的类型,以便在请求图像时设置正确的标题。这些图像从来都不是jpeg。@VMai目前我正在上载jpeg文件,所以这不应该是问题所在,您保存这些图像是什么意思script@KarishKarish您已经习惯于转义二进制数据。正如我所说,这可能还不够。请重写保存部分,使其也使用绑定机制。它可以确保您从图像中准确获取原始数据
 if(!$_FILES['image']['tmp_name']){
     $image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
     $image_name = addslashes($_FILES['image']['name']);
     $image_size = getimagesize($_FILES['image']['tmp_name']);
     if(!$insert = $db->query("INSERT INTO store (name,image) VALUES('{$image_name}','{$image}')")){
         echo "Problem uploading file";
     }else{
         echo $lastid = $db->insert_id;//returns the last id that was inserted 
         echo 'image uploaded.<p/> Your Image:<p/><img src='data:image/png;base64,<?=$image;?>';
     }
 }