Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Nie można znaleźć błędu w przesłanym kodzie obrazu php

Jest to bardzo solidna procedura, która tworzy podgląd 2 obrazów i duży.

Sprawdza również 3 typy obrazów pod kątem najmniejszego wyjścia. Nie obchodzi mnie, jaki jest format obrazu, ponieważ umieszczam go na stronie HTML jako base64.

Konwertuje również obrazy na base64 i zapisuje je w tabeli SQL oraz zapisuje obraz base64 na stronie HTML.

Podczas skalowania zdjęcia są wyświetlane do przeglądu.

Wygląda na to, że masz wystarczającą wiedzę na ten temat, aby zrozumieć mój kod.

Mogę to skomentować.

$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 = '';

Pobierz typ obrazu według jego typu MIME.

Następnie sprawdź ponownie za pomocą imagecreatefrom

Niezależnie od rozszerzenia, typu MIME, jeśli jest to obraz jpg, png lub gif, pozytywnie zidentyfikuje typ.

  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;}
      }
    }
  }
}

Skaluj do rozmiaru podglądu

 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();

Sprawdź, który typ obrazu tworzy najmniejszą liczbę bajtów

  $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">';
  }

Konwertuj na bas64 i zapisz

Używam obrazów base64 na moich stronach HTML. Eliminuje podróż w obie strony HTTP dla każdego obrazu.

Naysayers narzekają, że base64 dodaje 30% do rozmiaru obrazu. I tak.

Kiedy base64 jest osadzony w kodzie HTML, zostaje zgipowany. A dodatkowe 30% jest skompresowane przez gzip do znacznie mniej, typowo tylko kilka procent.

Podróż w obie strony HTTP różni się w zależności od serwera, pory dnia itp., ale zwykle wynosi 200 milisekund. Czas transmisji base64 to zwykle zaledwie kilka milisekund.

  $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");

Skaluj do dużego obrazu:

  $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");



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najszybszy sposób na odczytanie ogromnej tabeli MySQL w Pythonie

  2. Czytaj ogromne pliki tekstowe i przechowuj każdą linię w bazie danych

  3. Instrukcja tablicy PDO IN() ORAZ symbol zastępczy

  4. Czy szybciej czy lepiej jest używać MySQL zamiast plików tekstowych lub nazw plików do porządkowania obrazów w PHP?

  5. Konwertuj z mysqli_query na przygotowaną instrukcję mysqli za pomocą funkcji mysql HASŁO