画像ファイルのアップロード
画像ファイルアップロードの際には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; } } }