フォームからアップロードされたファイルをPHPで処理する
公開日:2014年5月28日
最終更新日:2014年7月13日
Webサイトにフォームを設置し、ローカルにあるファイルを指定してサーバーにアップロードするPHPコードを解説します。アップロード時には、エラーチェックとサーバー環境に合わせた文字コード変換処理を含めます。
【コンテンツ】
【記事執筆時の環境】
PHP 5.4.19
フォームの作成
ファイルアップロードを行うフォームを作成します。
formタグの中では、enctype属性を"multipart/form-data"として、
以下のように記述します。
1 2 3 4 |
<form action="" method="post" enctype="multipart/form-data"> <p>ファイル:<input type="file" name="userfile" size="40" /></p> <p><input type="submit" value="送信" /></p> </form> |
フォームの表示はブラウザの種類により異なりますので注意します。
<Chromeでの表示>
<IEでの表示>
アップロードされたファイル情報
アップロードされたファイルは、サーバーの「一時ファイル置き場」に保存されます。
保存時のファイル名は本来のファイル名ではなく、ランダムな名前で保存されます。
ただし本来のファイル名も情報として持っています。
アップロードされたファイル情報は、スーパーグローバル変数「$_FILES」に格納されます。
input要素にname属性で指定した名前を"userfile"とすると、ファイル情報は以下のようになります。
変数名 | 説明 |
---|---|
$_FILES["userfile"]["name"] | 送信されたファイル名 |
$_FILES["userfile"]["type"] | 送信されたファイルのMIME型 |
$_FILES["userfile"]["size"] | ファイルサイズ(バイト) |
$_FILES["userfile"]["tmp_name"] | 一時ファイルのパス |
$_FILES["userfile"]["error"] | エラーコード |
エラーのチェック
アップロード時には、エラーが発生していないかチェックし処理を分岐させます。
エラーコードとして、以下の定数が定義済みです。
UPLOAD_ERR_OK:アップロードが成功した
UPLOAD_ERR_NO_FILE:アップロードされなかった(何もファイルを指定しないで送信)
その他種々のエラー定数があります。
ファイルの保存
サーバーに一時保存されたファイルを正規の指定場所に保存します。
保存するには、move_uploaded_file()関数を使って、ファイルを一時保存先から指定場所へ移動します。
【書式】
move_uploaded_file(一時ファイルパス,移動先ファイルパス);
例えば、"uploads"というディレクトリをあらかじめ作成しておき、その中にファイルを保存するコードは以下になります。
1 2 3 |
$tempfile = $_FILES["userfile"]["tmp_name"]; $filename = $_FILES["userfile"]["name"]; $result = move_uploaded_file($tempfile, "uploads/".$filename)); |
なお一時ファイルはアップロード処理が終わると自動的に削除されますので、アップロード処理内で移動させる必要があります。
ファイル名文字コードの変換
ファイル名が日本語でつけられている場合、サーバーのOSが扱う文字コードに変換しないと、ファイル名が文字化けする可能性があります。
変換には、mb_convert_encoding()関数を使います。
【書式】
mb_convert_encoding(文字列,変換後の文字コード,変換前の文字コード);
例えばPHPの文字コードUTF-8は、WindowsではCP932に変換する必要がありますので、以下のように記述します。
1 |
$filename = mb_convert_encoding($filename, "cp932", "utf8"); |
PHP処理部のコード
エラーチェック、ファイル保存、文字コード変換をおり込んだPHP処理部のコード例は、以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php if($_SERVER["REQUEST_METHOD"] === "POST"){ if($_FILES["userfile"]["error"] == UPLOAD_ERR_OK){ $tempfile = $_FILES["userfile"]["tmp_name"]; $filename = $_FILES["userfile"]["name"]; $filename = mb_convert_encoding($filename, "cp932", "utf8"); //文字コード変換 $result = move_uploaded_file($tempfile, "uploads/".$filename); //ファイル保存 if($result == TRUE){ $message ="ファイルのアップロードに成功しました"; } else{ $message ="ファイルの移動に失敗しました"; } } elseif($_FILES["userfile"]["error"] == UPLOAD_ERR_NO_FILE) { $message ="ファイルがアップロードされませんでした"; } else { $message ="ファイルのアップロードに失敗しました"; } echo $message; } ?> |
スポンサーリンク