sql >> データベース >  >> RDS >> Mysql

画像コードphpのアップロードで間違いを見つけることができません

    これは、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タイプで取得します。

    次に、imagecreatefromを使用して再確認します

    拡張子、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に変換して保存

    HTMLページでbase64画像を使用しています。各画像のHTTPラウンドトリップを排除します。

    否定論者はbase64が画像サイズに30%を追加すると不平を言います。そしてそうです。

    base64がHTMLに埋め込まれている場合、zgippedになります。そして、余分な30%は、gzipによってはるかに少なく圧縮され、通常は数パーセントにすぎません。

    HTTPラウンドトリップは、サーバーごと、時刻などによって異なりますが、通常は200ミリ秒です。 base64の送信時間は通常わずか数ミリ秒です。

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



    1. Access2016でレポートをグループ化する方法

    2. JDBCタイプの方言マッピングなし:-9

    3. MySQL:クエリの週番号からの週の日付範囲

    4. PostgreSQLでの重複更新時に挿入しますか?