sql >> Database >  >> RDS >> Mysql

Kan geen fout vinden bij het uploaden van afbeeldingscode php

Dit is een zeer robuuste routine die een voorbeeld van 2 afbeeldingen maakt en groot is.

Het controleert ook de 3 afbeeldingstypen voor de kleinste uitvoer. Het maakt me niet uit welk formaat de afbeelding heeft, want ik zet het in de HTML-pagina als base64.

Het converteert ook de afbeeldingen naar base64 en slaat ze op in een SQL-tabel en slaat de base64-afbeelding op een HTML-pagina op.

Terwijl het schaalt, worden de foto's weergegeven voor beoordeling.

Je lijkt hier genoeg kennis over te hebben om mijn code te begrijpen.

Ik kan er commentaar op geven.

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

Krijg het type afbeelding op basis van het MIME-type.

Controleer dan opnieuw met imagecreatefrom

Ongeacht de extensie, het MIME-type, als het een afbeelding jpg, png of gif is, wordt het type positief geïdentificeerd.

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

Schaal naar de voorbeeldgrootte

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

Controleer welk afbeeldingstype het minste aantal bytes maakt

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

Converteren naar bas64 en opslaan

Ik gebruik base64-afbeeldingen in mijn HTML-pagina's. Het elimineert HTTP-round trip voor elke afbeelding.

De nee-zeggers klagen dat base64 30% aan de afbeeldingsgrootte toevoegt. En dat doet het.

Wanneer de base64 is ingesloten in de HTML, wordt deze gezgipped. En de extra 30% wordt door gzip tot veel minder gecomprimeerd, typisch slechts een paar procent.

Een HTTP Round-trip varieert van server tot server, tijd van de dag enz., maar meestal 200 milliseconden. De transmissietijd van de base64 is meestal slechts enkele milliseconden.

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

Schaal naar grote afbeelding:

  $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. De `yield_per()`-problemen van SQLalchemy beter begrijpen

  2. Optimaliseer MySQL-query om te voorkomen Gebruik waar; Tijdelijk gebruiken; Bestandssorteren gebruiken

  3. Hoe kan ik twee reeksen door komma's gescheiden getallen samenvoegen in MySQL?

  4. Probleem met het opslaan van grote getallen in mysql DB