その他
    ホーム 技術発信 DoRuby 【PHP】画像アップロードとリサイズの仕方(フォームの生成~リサイズ処理の方法)

    【PHP】画像アップロードとリサイズの仕方(フォームの生成~リサイズ処理の方法)

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    【PHP】画像アップロードとリサイズの仕方(フォームの生成~リサイズ処理の方法)

     フォーム生成からアップロードされた画像を保存する。

    プロジェクト内で画像のアップロードからリサイズ処理を見ることがあったので、

    勉強がてら処理内容を追ってみました。

    • 1.フォームの生成
    • 2.アップロードされたファイル情報取得
    • 3.画像の保存方法

    1. フォームの生成

     <form action="アクション先" method="post" enctype="multipart/form-data">
       <input type="file" name="upload_file" />
       <input type="submit" value="アップロード" />
    </form>
    

    ※ formタグのmethodをpostに、enctype=”multipart/form-data”を指定する必要があります。

    2. アップロードされたファイル情報取得

    アップロードされたファイルの情報は $_FILES に格納されます。

    $_FILES は $_POST や $_GET と同様、PHPが自動的に値をセットしてくれる連想配列です。

    また、アップロードしたファイルは一時的にサーバー側に保存され、PHPプログラムの実行が終了すると削除されるそうです。

    $upload_file = $_FILES["upload_file"];
    array(5) {
      ["name"]=>
      string(10) "Desert.jpg"
      ["type"]=>
      string(10) "image/jpeg"
      ["tmp_name"]=>
      string(14) "/tmp/phph8PFva"
      ["error"]=>
      int(0)
      ["size"]=>
      int(845941)
    }
    
    • name →アップロードファイル名
    • type →MIMEタイプ
    • tmp_name →アップロードされたファイルが一時的に保存されたファイルパス
    • error →エラーコード(正常にアップロードされた場合、0になります)
    • size →アップロードされたファイルサイズ

    となっています。

    3. 画像の保存方法

    アップロードされた画像は一時的に、tmp_name値で指定された箇所に保存されています。

    move_uploaded_file()を用いて、別ディレクトリに移動させます。

    move_uploaded_file( $upload_file["tmp_name"], ‘/img/upload/');
    

    とここまでの手順で、アップロードされた画像を保存することが可能です。

    4. 画像をリサイズするサンプルコード

    下記の1.~6.までの手順をサンプルに落としてみました。

    1.画像情報を取得する

    2.画像をコピー

    3.空画像を作成

    4.コピー画像を指定サイズで作成

    5.コピー画像を保存

    6.画像データ破棄

    $orig_file 元画像

    $resize_weight リサイズ幅

    $resize_height リサイズ高さ

    function sample_resize($orig_file, $resize_weight, $resize_height)
    {
    	// GDライブラリがインストールされているか
    	if (!extension_loaded('gd')) {
    	    // エラー処理
    	    return false;	
    	}
    
    	// 画像情報取得
    	$result = getimagesize($orig_file);
    	list($orig_width, $orig_height, $image_type) = $result;
    	
    	// 画像をコピー
    	switch ($image_type) {
    	    // 1 IMAGETYPE_GIF
    	    // 2 IMAGETYPE_JPEG
    	    // 3 IMAGETYPE_PNG
                case 1: $im = imagecreatefromgif($orig_file); break;
                case 2: $im = imagecreatefromjpeg($orig_file);  break;
                case 3: $im = imagecreatefrompng($orig_file); break;
                default: //エラー処理 
              return false;
            }	
    
    	// コピー先となる空の画像作成
    	$new_image = imagecreatetruecolor($resize_width, $resize_height);
            if (!$new_file) {
                // エラー処理 
    	    // 不要な画像リソースを保持するメモリを解放する
                imagedestroy($im);
                return false;
            }
    
     	// GIF、PNGの場合、透過処理の対応を行う
    	if [1]$image_type == 1) OR ($image_type==3 {
                imagealphablending($new_image, false);
                imagesavealpha($new_image, true);
                $transparent = imagecolorallocatealpha($new_image, 255, 255, 255, 127);
                imagefilledrectangle($new_image, 0, 0, $resize_width, $resize_height, $transparent);
            }
    
    	// コピー画像を指定サイズで作成
     	if (!imagecopyresampled($new_image, $im, 0, 0, 0, 0, $resize_width, $resize_height, $orig_width, $orig_height)) {
                // エラー処理
    	  // 不要な画像リソースを保持するメモリを解放する
                imagedestroy($im);
                imagedestroy($new_image);
                return false;
            }
    
            // コピー画像を保存
    	// $new_image : 画像データ
    	// $new_fname : 保存先と画像名
            // クオリティ
    
            switch ($image_type) {
    	    // 1 IMAGETYPE_GIF
    	    // 2 IMAGETYPE_JPEG
    	    // 3 IMAGETYPE_PNG
                case 1: $result = imagegif($new_image, $new_fname, $quality); break;
                case 2: $result = imagejpeg($new_image, $new_fname, $quality); break;
                case 3: $result = imagepng($new_image, $new_fname, $quality); break;
                default: //エラー処理 
              return false;
            }
    
            if (!$result) {
                // エラー処理 
    	    // 不要な画像リソースを保持するメモリを解放する
                imagedestroy($im);
                imagedestroy($new_image);
                return false;
            }
    
    	// 不要になった画像データ削除
    	imagedestroy($im);
            imagedestroy($new_image);
    
    }
    
    

    下記記事を書くにあたって参考にしたサイトになります、

    透過処理についての解説

    http://www.phppro.jp/qa/1269

    References

    References
    1 $image_type == 1) OR ($image_type==3
    記事を共有