戻る

ファイルをアップロードする

enctype属性、file属性、$_FILES、move_uploaded_file()関数

ファイルをアップロードするには、HTMLフォーム側のHTML文とそれを受け取る側のPHPスクリプトの両方でその処理を行う必要があります。

●HTMLフォーム側のHTML文

<form>タグにおいて、enctype属性として「multipart/form-data」を指定します。また、アプロードするファイルを入力するテキストボックスで、<input>タグのtype属性に「file」を指定します。

これによって、Webブラウザ上での実行時にはテキストボックスの右に「参照」ボタンが自動的に表示され、ファイル選択の画面を表示できるようになります。なお、アプロードされたファイルの情報を受け取り側のPHPスクリプトで認識できるように、必ずこのテキストボックスには任意のname属性を設定します。

●受け取り側のPHPスクリプト

アップロード自体は、HTMLフォームのsubmitボタンのクリックで自動的に行われます。その後、「$_FILES」というスーパーグローバル変数を使ってそのファイルの情報を取得し、必要に応じて、アップロードされたファイルを確認します。アップロードされたファイルはまだ一時的にサーバー上に置かれた状態なので、この後に正規の位置へ移動します。

「$_FILES」変数は多次元の連想配列になっています。例えばHTMLフォームのファイル名入力用テキストボックスのname属性が「uploadfile」となっている場合、以下のような記述によって、アプロードされたファイルの各種の情報を取得できます。

$_FILES["uploadfile"]["name"] → ユーザが指定した元のファイル名
$_FILES["uploadfile"]["size"] → ファイルのサイズ(バイト)
$_FILES["uploadfile"]["tmp_name"] → アップロード直後のテンポラリファイル名

この例ではファイルのアップロード後、以下のような処理を行っています。

●アップロードされたファイル名の長さを確認する

この確認にはstrlen()関数を使います。テキストボックスでファイルが指定されていない場合、この関数の返り値は「0」となるので、これを確認すればアップロードされたかを判別できます。

●アップロードファイルのサイズや拡張子を確認する

この処理は必須ではなく、必要に応じて行います。

●テンポラリファイルを正規の場所に移動する

アップロード後、テンポラリファイルが一時的にサーバ上に置かれるので、move_uploaded_file()関数を使って正規の場所に移動させます。この関数は、第1引数に指定した「アップロードテンポラリファイル」を第2引数の「ディレクトリ+ファイル名」へ移動させます。必要ならば、ここでファイルのリネームもできます。

なお、移動先に同名のファイルがある場合、エラーなどは発生せずに強制的に上書きされます。同じ名前のファイルがアップロードされる可能性がある場合は、保存日時のタイムスタンプを付加してユニークなファイル名にするなどの対処が必要です。

ファイルのアップロードに関しては、「php.ini」ファイルにいくつかの設定項目があります。

file_uploads = On → アップロード処理を有効にする。デフォルトはOn
upload_tmp_dir = → テンポラリファイルの保存ディレクトリ設定、デフォルトはコメントアウト
upload_max_filesize = 2M → アプロードを許可する最大容量。デフォルトは2M(バイト)

<?php
header("Content-type: text/html; charset=utf-8");

if (isset($_POST["btnExec"])) {
	//実行ボタンがクリックされたとき

	if(strlen($_FILES["uploadfile"]["name"]) > 0 ) {
		//画像ファイルがアップロードされたとき

		//アップロードされたファイルの情報を取得
		$fileinfo = pathinfo($_FILES["uploadfile"]["name"]);
		//ファイルの拡張子を取得して大文字に変換
		$fileext = strtoupper($fileinfo["extension"]);
		
		//エラーメッセージ初期化
		$errmsg = "";
		
		if ($_FILES["uploadfile"]["size"] > 102400) {
			//アップロードファイルのサイズ上限をチェック
			$errmsg .= "ファイルサイズが大きすぎます! 100KB以下にしてください。<br>";
		}
		elseif ($_FILES["uploadfile"]["size"] == 0) {
			//アップロードファイルのサイズ下限をチェック
			$errmsg .= "ファイルが存在しないか空のファイルです!<br>";
		}
		elseif ($fileext != "GIF" and $fileext != "JPG" ) {
			//アップロードファイルの拡張子をチェック
			$errmsg .= "対象ファイルはGIFまたはJPGのみです!<br>";
		}
		else {
			//アップロードされたファイルを正規に配置するパスを設定
			//ここではimagesディレクトリの下に"upf_"+元の名前で配置
			$movetofile = "images/upf_" . $_FILES["uploadfile"]["name"];
		
			//アップロードされたテンポラリファイルを正規の場所に移動
			if (! move_uploaded_file($_FILES["uploadfile"]["tmp_name"], $movetofile)) {
				$errmsg .= "ファイルのアップロードに失敗しました。<br>";
			}
		}

		if ($errmsg == "") {
			//正常にアップロードされたときはその画像を表示
			echo $_FILES["uploadfile"]["name"] . "<br>";
			echo "<img src='$movetofile'><br><br><br>";
		}
		else {
			//いずれかのエラーがあったとき
			//エラーメッセージを表示
			echo $errmsg . "<br><br><br>";
			//アップロードされたテンポラリファイルを削除
			@unlink($_FILES["uploadfile"]["tmp_name"]);
		}
	
	}

	else {
		echo "アップロードするファイルが指定されていません!<br><br><br>";
	}

}

?>
<!DOCTYPE HTML>
<html lang="ja-JP">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
アップロードする画像ファイルを指定して[実行]ボタンをクリックしてください。
<form action="<?=$_SERVER["PHP_SELF"]?>" method="POST" enctype="multipart/form-data">
<input type="file" name="uploadfile" size="60">
<br><br>
<input type="submit" name="btnExec" value="実行">
</form>
</body>
</html>

inserted by FC2 system