【 ファイルのアップロード 】

1. アップロードフォームより情報の収集
2. アップロード環境の設定
3. 実際のアップロード
4. ファイルの拡張子のチェック
5. 画像ファイルをサイズ変更してアップロードする

<HTML><HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=shift_jis">
</HEAD>
<BODY>
<FORM 
	enctype="multipart/form-data"
	action="<?= basename($_SERVER['SCRIPT_NAME']) ?>"
	method="POST"
>
 
	<INPUT type="hidden" name="MAX_FILE_SIZE" value="30000">
	アップロードするファイル : 
	<INPUT name="MyUploadFile" type="file" style='width:400'>
	<INPUT type="submit" value="アップロード">
 
</FORM>
<PRE>
<?
print_r( $_FILES );
?>
</PRE>
</BODY></HTML>


  • 以下は実行結果です
  • Array
    (
        [MyUploadFile] => Array
            (
                [name] => sqlwin144a.lzh
                [type] => application/octet-stream
                [tmp_name] => C:\DOCUME~1\lightbox\LOCALS~1\Temp\php5A.tmp
                [error] => 0
                [size] => 16492
            )
     
    )
    


  • MAX_FILE_SIZE15000 にすると以下のようになります
  • Array
    (
        [MyUploadFile] => Array
            (
                [name] => sqlwin144a.lzh
                [type] => 
                [tmp_name] => 
                [error] => 2
                [size] => 0
            )
     
    )
    

    php.ini
  • ファイルのアップロードに関する設定は、3つあります


  •   名前 デフォルト 説明
    1
    file_uploads
    "1"
    HTTP ファイルアップロードを
    有効とするかどうか
    2
    upload_tmp_dir
    NULL
    ファイルアップロード時にフ
    ァイル保存に用いるテンポ
    ラリディレクトリ
    3
    upload_max_filesize
    "2M"
    アップロードされるファイル
    の最大サイズ


  • これ以外にも、post_max_size があり、POSTデータに許可される最大サイズを設定します。この設定は、
    ファイルアップロードにも影響します。大きなファイルをアップロードするには、この値を upload_max_filesize
    より大きく設定する必要があります

  • upload_tmp_dir は指定しなくても動作しますが、テストの為に変更します --> "d:\temp"
  • <HTML><HEAD>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=shift_jis">
    </HEAD>
    <BODY>
    <FORM 
    	enctype="multipart/form-data"
    	action="<?= basename($_SERVER['SCRIPT_NAME']) ?>"
    	method="POST"
    >
     
    	<input type="hidden" name="MAX_FILE_SIZE" value="30000">
    	アップロードするファイル : 
    	<input name="MyUploadFile" type="file" style='width:400'>
    	<input type="submit" value="アップロード">
     
    </FORM>
    <PRE>
    <?
     
    	if ( $_SERVER['REQUEST_METHOD'] == "POST" ) {
     
    		$upload = "D:\\LOCALWEB\\phpmaterial\\upload\\";
    		$upload .= $_FILES['MyUploadFile']['name'];
    		if ( move_uploaded_file( $_FILES['MyUploadFile']['tmp_name'], $upload ) ) {
    			print "アップロードに成功しました\n";
    		}
    		else {
    			print "アップロードに失敗しました\n";
    		}
     
    	}
     
    ?>
    </PRE>
    </BODY></HTML>
    


  • リクエストが終了するとテンポラリファイルは削除されるので、スクリプト中で move_uploaded_file 関数を使用
    してファイルを移動させます


  • いろいろな方法がありますが、basename 関数を利用しています

  • 文字列長の比較をしているのは、拡張子が無いファイルの対応です
  • <PRE>
    <?
     
    if ( $_SERVER['REQUEST_METHOD'] == "POST" ) {
     
    	$target = $_FILES['MyUploadFile']['name'];
    	$target = strtoupper($target);
    	$ext = array("JPG","JPEG","PNG");
    	$file_ok = false;
    	foreach( $ext as $Value ) {
    		$target2 = basename( $target, $Value );
    		if ( strlen( $target2 . $Value ) == strlen( $target ) ) {
    			$file_ok = true;
    			break;
    		}
    	}
     
    	if ( $file_ok ) {
    		$upload = "D:\\LOCALWEB\\phpmaterial\\upload\\";
    		$upload .= $_FILES['MyUploadFile']['name'];
    		if ( move_uploaded_file( $_FILES['MyUploadFile']['tmp_name'], $upload ) ) {
    			print "アップロードに成功しました\n";
    		}
    		else {
    			print "アップロードに失敗しました\n";
    		}
    	}
    	else {
    		print "アップロード対象ファイルではありません\n";
    	}
     
    }
     
    ?>
    </PRE>
    

    GD2ライブラリの使用
  • windows では、php.ini を以下のようにします

    extension=php_gd2.dll


  • GD1 DLL php_gd.dllはPHP4.3.2で削除されました
  • <HTML><HEAD>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=shift_jis">
    </HEAD>
    <BODY>
    <FORM 
    	enctype="multipart/form-data"
    	action="<?= basename($_SERVER['SCRIPT_NAME']) ?>"
    	method="POST"
    >
     
    	<input type="hidden" name="MAX_FILE_SIZE" value="500000">
    	アップロードするファイル : 
    	<input name="MyUploadFile" type="file" style='width:400'>
    	<input type="submit" value="アップロード">
     
    </FORM>
    <PRE>
    <?
     
    if ( $_SERVER['REQUEST_METHOD'] == "POST" ) {
     
    	$target = $_FILES['MyUploadFile']['name'];
    	$target = strtoupper($target);
    	$ext = array("JPG","JPEG","PNG");
    	$file_ok = false;
    	foreach( $ext as $Value ) {
    		$target2 = basename( $target, $Value );
    		if ( strlen( $target2 . $Value ) == strlen( $target ) ) {
    			$file_ok = true;
    			break;
    		}
    	}
     
    	if ( $file_ok ) {
    		if ( is_uploaded_file( $_FILES['MyUploadFile']['tmp_name'] ) ) {
    			ImageConvert( );
    		}
    		else {
    			print "アップロードに失敗しました\n";
    		}
    	}
    	else {
    		print "アップロード対象ファイルではありません\n";
    	}
     
    }
     
    # **********************************************************
    # アップロードされたファイルを縮小して保存
    # **********************************************************
    function ImageConvert() {
     
    	$upload = "D:\\LOCALWEB\\phpmaterial\\upload\\";
    	$upload .= $_FILES['MyUploadFile']['name'];
     
    	# テンポラリディレクトリにある実際のファイル
    	$file	= $_FILES['MyUploadFile']['tmp_name'];
     
    	# ファイルの属性等を取得
    	$target	= getimagesize( $file );
     
    	# 現在のサイズ
    	$width	= $target[0];
    	$height	= $target[1];
     
    	# 新しいサイズ
    	$width_new	= 200;
    	$height_new = (int)( ($height/$width)*$width_new );
     
    	# JPEG の場合
    	if ( $target[2] == IMAGETYPE_JPEG ) {
    		# 元のファイルのハンドル
    		$jpeg		= imagecreatefromjpeg ( $file );
    		# 新しいイメージ
    		$jpeg_new	= imagecreatetruecolor( $width_new, $height_new );
    		# サイズ変更して新しいイメージへ転送
    		$ret = imagecopyresampled(
    			$jpeg_new,
    			$jpeg,
    			0,
    			0,
    			0,
    			0,
    			$width_new,
    			$height_new,
    			$width,
    			$height
    		);
     
    		if ( !$ret ) {
    			print "サイズ変更に失敗しました\n";
    			return;
    		}
     
    		# JPEG ファイルとして、クオリティ 100 で出力
    		$ret = imagejpeg ( $jpeg_new, $upload, 100);
    		if ( !$ret ) {
    			print "ファイル作成に失敗しました\n";
    			return;
    		}
     
    		print "アップロードが完了しました\n";
    		print "<IMG src='upload/{$_FILES['MyUploadFile']['name']}'>";
    		return;
     
    	}
     
    	# PNG の場合
    	if ( $target[2] == IMAGETYPE_PNG ) {
    		$png		= imagecreatefrompng( $file );
    		$png_new	= imagecreatetruecolor( $width_new, $height_new );
    		$ret = imagecopyresampled(
    			$png_new,
    			$png,
    			0,
    			0,
    			0,
    			0,
    			$width_new,
    			$height_new,
    			$width,
    			$height
    		);
     
    		if ( !$ret ) {
    			print "サイズ変更に失敗しました\n";
    			return;
    		}
     
    		$ret = imagepng ( $png_new, $upload );
    		if ( !$ret ) {
    			print "ファイル作成に失敗しました\n";
    			return;
    		}
     
    		print "アップロードが完了しました\n";
    		print "<IMG src='upload/{$_FILES['MyUploadFile']['name']}'>";
    		return;
     
    	}
     
    	print "アップロード対象ファイルではありません\n";
     
    }
    ?>
    </PRE>
    </BODY></HTML>