php - 图像上传和操作,然后作为 blob 存储在数据库中失败

标签 php mysql image mysqli

我不明白。 目标如标题中所述,我做了一个多部分形式和简单地将图像上传到数据库的工作(!),但是......

我的下一步是修改上传的文件。我想添加一个 Logo 。然后我的问题就开始了。

我添加了很多调试信息并一步步识别:一个简单上传文件的二进制图像数据(很好地保存在数据库中!)与 imagecopy 生成的二进制文件(未保存在数据库中)不同数据库)。

所以我需要一些帮助。请快速浏览一下:

<?php  
error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');
ini_set('log_errors', 'On');
ini_set('error_log', 'php-errors.log');

if (! isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $client_ip = $_SERVER['REMOTE_ADDR'];
}else{
    $client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
$connect = mysqli_connect("mysql..de", "", "", "");  
if(isset($_POST["insert"]))  
{  
    if( isset($_POST["copyrights"]) ){
        $file = addslashes(file_get_contents($_FILES["image"]["tmp_name"]));  
        /*
        // start adding Logo
        $stampfile=getcwd().'/Logo2.jpg';
        $stamp=imagecreatefromjpeg($stampfile);
        
        $im = imagecreatefromjpeg($_FILES["image"]["tmp_name"]);

        
        $marge_right = 10;
        $marge_bottom = 10;
        $sx = imagesx($stamp);
        $sy = imagesy($stamp);

        imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
        
        $file="";
        
        ob_start();
        imagejpeg($im,NULL,100);
        $file = ob_get_contents();
        ob_get_clean();
        imagedestroy($im);
        //end adding logo
        */
        echo "file-enght(string/blob):".strlen($file);
        echo $file;
        $query = "INSERT INTO myjoints_images(image,uploadDate,state,ip) VALUES ('$file',UNIX_TIMESTAMP(),NULL,'$client_ip')";  
        if(mysqli_query($connect, $query))  
        {  
            //ok
        }  
    }else{
        echo '<script>alert("Upload fehlgeschlagen! Du musst die Nutzungsvereinbarung akzeptieren!")</script>';  
    }
}  

?> 

结果是: 如果我只上传图片,图像存储在数据库中,类型/大小为:

file-enght(string/blob):793506����\0JFIF\0\0`\0`\0\0��-Exif\0\0MM\0*\0\0\0\02\0\0\0\0\0\0\0bGF\0\0\0\0\0\0\0GI\0\0\0\0\0X\0\0��\0\0\0\0\0\0\0v��...

如果我运行我的模组,图像不存储在数据库中,类型/大小是:

file-enght(string/blob):551227����JFIF``��a]�|����F�2��,6�As����@�ط���U�Lq�T�Dy8Vf<4(A�P˴0� �'�;#)�~h�T!e����gE1+!C;yk�r���>zū+�k�ҍ��+�������m8��iGh��m-9yU���j��{7�z���...

我每次都上传同一张图片。

最佳答案

您无法使用addslashes()转义数据库存储的数据。使用prepared statements相反。

尽管使用旧的 mysqli 扩展存储大量数据存在问题,但类似的东西应该可以工作。 PDO 是一种更好、更现代的方法。

if (! isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $client_ip = $_SERVER['REMOTE_ADDR'];
}else{
    $client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
$connect = new mysqli("host", "username", "password", "database");  
if(isset($_POST["insert"]))  
{  
    if( isset($_POST["copyrights"]) ){
        // start adding Logo
        $stampfile = './Logo2.jpg';
        $stamp = imagecreatefromjpeg($stampfile);
        $im = imagecreatefromjpeg($_FILES["image"]["tmp_name"]);
        $mr = 10;
        $mb = 10;
        $sx = imagesx($stamp);
        $sy = imagesy($stamp);
        imagecopy($im, $stamp, imagesx($im) - $sx - $mr, imagesy($im) - $sy - $mb, 0, 0, imagesx($stamp), imagesy($stamp));

        // output and destroy the image before getting buffer to ensure we get everything
        ob_start();
        imagejpeg($im, null, 100);
        imagedestroy($im);
        $file = ob_get_clean();

        $sql = "INSERT INTO myjoints_images(image,uploadDate,state,ip) VALUES (?,UNIX_TIMESTAMP(),NULL,?)";
        // of course you should check these statements for successful execution
        $stmt = $connect->prepare($sql);
        $stmt->bind_param("bs", $file, $client_ip);
        $stmt->execute();
    }else{
        echo '<script>alert("Upload fehlgeschlagen! Du musst die Nutzungsvereinbarung akzeptieren!")</script>';  
    }
}

关于php - 图像上传和操作,然后作为 blob 存储在数据库中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53013318/

相关文章:

php - 直接在 PHP 中访问 psql-array

尝试使用 stat() 或 filemtime() 时出现 PHP 警告

mysql - Phpmyadmin 在 raspbian 上返回 TIMESTAMPDIFF 的空值

mysql - 从字段中剥离空格后,Ruby/ActiveRecord 未检测到更改

php - android httppost 为什么在 PHP/MySQL 中使用 $_REQUEST 而不是 $_POST ?

php - MySQL 删除行如果

mysql - 无法连接到 mysql docker 镜像

javascript - 使用 FileReader 循环 &lt;input multiple> 仅显示 div 网格中的最后一个图像

javascript - 图片直接加载正常,但不在实际页面上

html img 百分比在 ipad 中看起来很尴尬