ファイルをアップロードするには、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>