画像ファイルのアップロード

画像ファイルアップロードの際にはGIFやJPEGなど画像の種類によって処理内容を分けてやらなくてはいけない。

//画像のアップロード先ディレクトリの設定
$up_dir = '/img/'; …画像をアップするディレクトリ名
//「/img」ディレクトリのパスの設定
環境変数$PATH_TRANSLATEDでdirname()関数を使って
スクリプト本体のある階層を求め、$up_dirをつなげる。

$path = dirname($PATH_TRANSLATED).$up_dir;
スーパーグローバル変数で取得する場合は、
$path = dirname($_SERVER["PATH_TRANSLATED"]).$up_dir;

画像送信フォームについて、

画像送信フォームの属性は、
「ENCTYPE="multipart/form-data"」でなくてはいけない。

変数名をupfileとすると、フォーム

から送信された画像ファイルは、以下のような形で得られる。

$upfile 
サーバマシンにアップロードされたファイルが保存されているテンポラリファイル名。

$upfile_name 
送信元のシステムにおける元のファイルの名前又はパス。

スーパーグローバル変数で取得する場合は、

$upfile = $_FILES['upfile']['tmp_name'];
$upfile_name = $_FILES['upfile']['name'];

■送信された画像の属性の取得
送信された画像の種類に応じて、ログファイルに記録する画像ファイル名を区別する。getimagesize()関数を使って各要素を取り出す。

【getimagesize()関数】

任意のGIF、 JPG、PNG、SWF、SWC、
PSD、TIFF、BMP、IFF、JP2、JPX、JB2、
JPC、XBM、もしくはWBMPファイルの大きさを定義し、 
ファイルの型と HTMLIMG タグ中で通常使用される
高さと幅からなる寸法を表す文字列を返す。
返り値は、4つの要素からなる配列。

0番目の要素は、ピクセル単位 での画像の幅。
1番目の要素は高さ。
2番目の要素は画像の種類を 示すフラグ。

1 = GIF、2 = JPG、3 = PNG、4 = SWF、
5 = PSD、6 = BMP、7 = TIFF(intel byte order)、
8 = TIFF(motorola byte order)、9 = JPC、
10 = JP2、11 = JPX、12 = JB2、13 = SWC、
14 = IFF、15 = WBMP、16 = XBM

3番目の要素はIMGタグで直接利用できる
文字列 "height=xxx width=xxx"
$imagesize = getimagesize($upfile);

$imagesize[2]の値で画像の種類が判別できる。

       switch($imagesize[2]){
          case 1:
            $out = $code . ".gif";
            break;
          case 2:
            $out = $code . ".jpg";
            break;
          case 3:
            $out = $code . ".png";
            break;
          default:
            unlink($upfile);
        }

今の段階では、アップした画像ファイルはまだサーバの「/tmp」ディレクトリ内にある。
上記処理で得られたログ記録用ファイル名を使い、move_uploaded_file()関数を使って、指定のディレクトリ内に画像ファイルを移動させる。

【画像ファイルの移動】

$sendpath = $path.$out; …移動先のパス及びファイル名
move_uploaded_file($upfile, $sendpath);

これでアップロードした画像ファイルが「/tmp」ディレクトリから削除され、指定のディレクトリ内に指定のファイル名でコピーされる。
最後にアップロードした画像ファイルの属性を「666」に変更し、スクリプトを通じてアップされた画像の所有者情報が、WWWサーバ・デーモン「httpd」指定のnobodyやappachになるのを防ぐ。

chmod($sendpath,0666);

属性を変更しておかないと、FTPで接続してファイルの
バックアップを取ろうとしても、所有者の違いからダウンロードに失敗してしまう。

【処理の全体】

初期設定
$up_dir = '/img/';
//スーパーグローバル変数対策
if(!isset($PATH_TRANSLATED)){
    $path = dirname($_SERVER["PATH_TRANSLATED"]).$up_dir;
    }else{
    $path = dirname($PATH_TRANSLATED).$up_dir;
    }

if(!isset($upfile)){ 
     $upfile = $_FILES['upfile']['tmp_name'];
    }
if(!isset($upfile_name)){
     $upfile_name = $_FILES['upfile']['name'];
    }

//画像のアップロード処理
if(is_uploaded_file($upfile)){
  $imagesize = getimagesize($upfile); 

//画像の属性を取得
   switch($imagesize[2]){
      case 1:
        $out = $code . ".gif";
        break;
      case 2:
        $out = $code . ".jpg";
        break;
      case 3:
        $out = $code . ".png";
        break;
      default:
        unlink($upfile);
   }
   if($out){
     $sendpath = $path.$out;
      if(move_uploaded_file($upfile, $sendpath)){
              chmod($sendpath,0666);
              $fname = $out;
         }
    }
  }