Я пытаюсь реализовать загрузку изображений в php. Я просмотрел некоторые статьи, но я не могу найти ошибку в своем коде. websitename/upload_avatar.php
появляется в адресной строке, но путь изображения не отображается в таблице MySQL. Что здесь не так?
Форма HTML:
<form action="upload_avatar.php" method="post" enctype="multipart/form-data"> <input type="FILE" onchange="this.form.submit()" name="ava" value=""></form>
В upload_avatar.php
:
<?php include ("bd.php"); if (empty($_FILES['ava']['name'])) { $avatar = "avatars/default.jpg"; } else { $path_directory = 'avatars/'; if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['ava']['name'])) { $filename = $_FILES['ava']['name']; $source = $_FILES['ava']['tmp_name']; $target = $path_directory . $filename; move_uploaded_file($source, $target); if(preg_match('/[.](GIF)|(gif)$/', $filename)) { $im = imagecreatefromgif($path_directory.$filename) ; } if(preg_match('/[.](PNG)|(png)$/', $filename)) { $im = imagecreatefrompng($path_directory.$filename) ; } if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) { $im = imagecreatefromjpeg($path_directory.$filename); } $w = 150; $w_src = imagesx($im); $h_src = imagesy($im); $dest = imagecreatetruecolor($w,$w); if ($w_src>$h_src) imagecopyresampled($dest, $im, 0, 0, round((max($w_src,$h_src)-min($w_src,$h_src))/2), 0, $w, $w, min($w_src,$h_src), min($w_src,$h_src)); if ($w_src < $h_src) imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, min($w_src,$h_src), min($w_src,$h_src)); if ($w_src==$h_src) imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src); $date=time(); imagejpeg($dest, $path_directory.$date.".jpg"); $avatar = $path_directory.$date.".jpg"; $delfull = $path_directory.$filename; unlink ($delfull); $result = mysql_query ("INSERT INTO users (avatar) VALUES('$avatar')"); } else { exit ("Image must be <strong>JPG,GIF or PNG</strong>"); } } ?>
Это очень надежная рутина, которая создает предварительный просмотр 2 изображений и большой.
Он также проверяет 3 типа изображений для наименьшего вывода. Мне все равно, в каком формате это изображение, поскольку я помещаю его в HTML-страницу как base64.
Он также преобразует изображения в base64 и сохраняет их в таблице SQL и сохраняет изображение base64 на HTML-странице.
В то время как масштабирование фотографий отображается для просмотра.
Кажется, у вас достаточно знаний об этом, чтобы понять мой код.
Я могу прокомментировать это.
$thumbWidth = 60; $thumbHeight = 60; $previewWidth = 200; $previewHeight = 150; $bigWidth = 800; $bigHeight = 600; if( is_uploaded_file($_FILES['ava']['tmp_name']) || !($_FILES['ava']['error'] !== UPLOAD_ERR_OK)){ $save = false; $jspan = ''; $gspan = ''; $pspan = '';
Получите тип изображения по типу MIME.
Затем перепроверьте использование imagecreate from
Независимо от расширения, MIME-тип, если это изображение jpg, png или gif, оно положительно идентифицирует тип.
switch(strtolower($_FILES['ava']['type'])){ case 'image/jpeg': $image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} case 'image/png': $image = @imagecreatefrompng($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} case 'image/gif': $image = @imagecreatefromgif($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} default: $img = @getimagesize($_FILES['ava']['tmp_name']); switch(strtolower($img['mime'])){ case 'image/jpeg': $image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} case 'image/png': $image = @imagecreatefrompng($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} case 'image/gif': $image = @imagecreatefromgif($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} default: $filename = $_FILES['ava']['name']; $ext = substr($filename,-3); switch(strtolower($ext)){ case 'jpg': $image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} case 'gif': $image = @imagecreatefromgif($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} case 'png': $image = @imagecreatefrompng($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} default: $image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} $image = @imagecreatefrompng($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} $image = @imagecreatefromgif($_FILES['ava']['tmp_name']); if ($image !== false){$save = true;break;} } } } }
Масштабирование до размера предварительного просмотра
if ($save === true){ $originalWidth = imagesx($image); $originalHeight = imagesy($image); $scale = min($previewWidth/$originalWidth, $previewHeight/$originalHeight); $newWidth = ceil($scale*$originalWidth); $newHeight = ceil($scale*$originalHeight); $newPic = imagecreatetruecolor($newWidth, $newHeight); imagecopyresampled($newPic, $image,0, 0, 0, 0,$newWidth, $newHeight, $originalWidth, $originalHeight); ob_start(); imagejpeg($newPic, NULL, 70); $jpg = ob_get_clean(); ob_clean(); ob_end_flush(); $jLen = strlen($jpg); ob_start(); imagepng($newPic, NULL, 9); $png = ob_get_clean(); ob_clean(); ob_end_flush(); $pLen = strlen($png); ob_start(); imagegif($newPic); $gif = ob_get_clean(); ob_clean(); ob_end_flush();
Проверьте, какой тип изображения создает наименьшее количество байтов
$gLen = strlen($gif); if ($gLen < $jLen){ if ($pLen < $gLen){ $raw = $png; $png = null; $type = 'png'; $pspan = '<span class="size">'; } else{ $raw = $gif; $gif = null; $type = 'gif'; $gspan = '<span class="size">'; } } elseif($pLen < $jLen){ $raw = $png; $png = null; $type = 'png'; $pspan = '<span class="size">'; } else{ $raw = $jpg; $jpg = null; $type = 'jpg'; $jspan = '<span class="size">'; }
Преобразовать в bas64 и сохранить
Я использую изображения base64 на своих HTML-страницах. Это исключает обратную маршрутизацию HTTP для каждого изображения.
Заявители жалуются, что base64 добавляет 30% к размеру изображения. И это так.
Когда base64 встроен в HTML, он получает zgipped. А дополнительные 30% сжимаются gzip до гораздо меньшего, типично всего несколько процентов.
Поездка по маршруту HTTP варьируется от сервера к серверу, времени суток и т. Д., Но обычно составляет 200 миллисекунд. Время передачи базы64 обычно составляет всего несколько миллисекунд.
$base64 = base64_encode($raw); $thumb1 = "<img width=\"$newWidth\" height=\"$newHeight\" src=\"data:image/$type;base64,$base64\" alt =\"profile thumb one\"/>"; $size = 'Thumb'; echo "<p>Image $num $size <br>$jspan jpg: $jLen bytes</span>, <br>$gspan gif: $gLen bytes</span>, <br>$pspan png: $pLen bytes</span></p> $thumb1"; $filename = 'thumb1.' . $type; $fp = fopen($filename ,"w"); fwrite($fp, $raw); fclose($fp); imagedestroy($newPic); $filename = "thumb1_$type.html"; $fp = fopen($filename ,"w"); fwrite($fp, $thumb1); fclose($fp); $thumb1 = mysql_escape_string($thumb1); @mysql_unbuffered_query("UPDATE `photos` SET `thumb1`='$thumb1' WHERE `id`=$id");
Масштаб до большого изображения:
$scale = min($bigWidth/$originalWidth, $bigHeight/$originalHeight); $newWidth = ceil($scale*$originalWidth); $newHeight = ceil($scale*$originalHeight); $newPic = imagecreatetruecolor($newWidth, $newHeight); imagecopyresampled($newPic, $image,0, 0, 0, 0,$newWidth, $newHeight, $originalWidth, $originalHeight); ob_start(); imagejpeg($newPic, NULL, 70); $jpg = ob_get_clean(); ob_clean(); ob_end_flush(); $jLen = strlen($jpg); ob_start(); imagepng($newPic, NULL, 9); $png = ob_get_clean(); ob_clean(); ob_end_flush(); $pLen = strlen($png); ob_start(); imagegif($newPic); $gif = ob_get_clean(); ob_clean(); ob_end_flush(); $gLen = strlen($gif); if ($gLen < $jLen){ if ($pLen < $gLen){ $raw = $png; $png = null; $type = 'png'; $pspan = '<span class="size">'; } else{ $raw = $gif; $gif = null; $type = 'gif'; $gspan = '<span class="size">'; } } elseif($pLen < $jLen){ $raw = $png; $png = null; $type = 'png'; $pspan = '<span class="size">'; } else{ $raw = $jpg; $jpg = null; $type = 'jpg'; $jspan = '<span class="size">'; } $base64 = base64_encode($raw); $size = 'Full Size'; $filename = 'big1.' . $type; $big1 = "<img width=\"$newWidth\" height=\"$newHeight\" src=\"data:image/$type;base64,$base64\" alt =\"profile photo one\"/>"; echo "<p>Image $num $size <br>$jspan jpg: $jLen bytes</span>, <br>$gspan gif: $gLen bytes</span>, <br>$pspan png: $pLen bytes</span></p> $big1"; $fp = fopen($filename ,"w"); fwrite($fp, $raw); fclose($fp); imagedestroy($newPic); $filename = "big1_$type.html"; $fp = fopen($filename ,"w"); fwrite($fp, $big1); fclose($fp); $big1 = mysql_escape_string($big1); @mysql_unbuffered_query("UPDATE `photos` SET `big1`='$big1' WHERE `id`=$id");