我不明白。 如标题所述,我做了一个多部分表单,并简单地将图像上传到数据库作品(!),但是...
下一步是修改上传的文件。我想添加一个徽标。然后我的问题开始了。.
我添加了许多调试信息,并逐步认识到:简单上载的文件的二进制图像数据(将其很好地保存在数据库中!)与通过imagecopy生成的二进制文件(不将其保存在DB)。
所以我需要一些帮助。请快速浏览:
<?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��...
如果我运行我的mod,图像未存储在数据库中,则类型/大小为:
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���...
我每次都上传相同的图片。
答案 0 :(得分:0)
您无法使用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>';
}
}
答案 1 :(得分:0)
非常感谢您的输出,删除了addlashes,base64_encode起到了作用