16. ファイルアップロード
今日はファイルアップロードについて、ご説明いたします。
■ファイルアップロードの概要
ユーザから、画像などのファイルをアップロードして保存したい場合などが
あるかと思います。PHPを使用すれば、こういった場合でもブラウザから
ユーザのローカルマシンに入っているファイルをサーバへアップロードして
もらうことができます。
■HTMLの記述
まず、ファイルアップロードをしてもらうためのページを作成します。
ファイルアップロードをするには、通常のフォームではできません。
<form>タグのenctypeに、multipart/form-dataを指定し、ファイル名を指定する
ボックスを用意します。
-----------------------------------------------------------------
<HTML>
<BODY>
<FORM action="upload.php" enctype="multipart/form-data" method="post">
ファイル: <INPUT type="file" name="upload_file" size="32"><BR>
<INPUT type="submit" value="送信">
</FORM>
</BODY>
</HTML>
-----------------------------------------------------------------
enctypeに、multipart/form-dataを指定しない場合は、テキストを送るという
ことになりますが、上記のように記述すると、テキスト以外のバイナリファイル
をアップロードできます。
<input>タグのtypeにfileを指定すると、ファイルの参照ボタンの付いたテキスト
ボックスが表示されます。これにより、ユーザが自分のローカルマシンのファイルを
選んで、アップロードすることができます。
また、ファイルをアップロードしてもらう場合は、必ずPOST送信にしてください。
■受け取り側の処理
アップロードされたファイルを受け取る処理をご説明します。
PHPでは、アップロードされたファイル情報は、$_FILEというハッシュ配列に情報が
格納されています。
-----------------------------------------------------------------
// ファイル名
$file_name = $_FILES["upload_file"]["name"];
// 一時ファイル
$tmp_file = $_FILES["upload_file"]["tmp_name"];
// ファイルサイズ
$file_size = $_FILES["upload_file"]["size"];
// ファイルタイプ
$file_type = $_FILES["upload_file"]["type"];
-----------------------------------------------------------------
上記で、"upload_file"というのは、送信側のHTMLに記述した<INPUT TYPE="file">
のNAMEになります。
ファイル名"name"は、ローカルで指定したファイル名になります。つまり、
sample.jpgというファイルをアップロードした場合、そのままsample.jpgが
得られます。
一時ファイル"tmp_name"というのは、アップロードされたファイルは、一時サーバに
保存され、クライアントにレスポンスを返した時点で、一時ファイルは消されます。
その一時ファイルのパスです。これを利用して、一時ファイルをコピーしたり、
データベースに書き込んだりします。
ファイルサイズ"size"は、ファイルのサイズをバイト数で返します。
ファイルタイプ"type"は、MIMEタイプと呼ばれ、ファイルの形式が分かる文字列を
取得できます。
例えば、GIF画像をアップロードした場合は、、"image/gif"という文字列が得られ
ます。
アップロードされたファイルは、通常、以下のようにコピーして保存します。
-----------------------------------------------------------------
$file_path = "./image.jpg";
// ファイルのコピー
if (!copy($_FILE["upload_file"]["tmp_name"], $file_path)) {
print "コピーに失敗しました。" . $file_path;
exit;
}
-----------------------------------------------------------------
★今日のまとめサンプルプログラム
index.php
-----------------------------------------------------------------
<HTML>
<BODY>
<FORM action="upload.php" enctype="multipart/form-data" method="post">
画像ファイル: <INPUT type="file" name="upload_file" size="32"><BR>
<INPUT type="submit" value="送信">
</FORM>
</BODY>
</HTML>
-----------------------------------------------------------------
upload.php
-----------------------------------------------------------------
<HTML>
<BODY>
<?
// ファイル名
$file_name = $_FILES["upload_file"]["name"];
// 保存するファイルパス
$file_path = "./image.jpg";
// ファイルタイプ
$file_type = $_FILES["upload_file"]["type"];
// ファイルのコピー
if (!copy($_FILES["upload_file"]["tmp_name"], $file_path)) {
print "コピーに失敗しました。" . $file_path;
exit;
}
?>
<img src="./<?=$file_path?>"><br>
ファイル名 : <?=$file_name?><br>
MIMEタイプ : <?=$file_type?><br>
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
このサンプルは、画像ファイルをアップロードし、アップロードされたファイルを
表示するプログラムです。
このプログラムを実行すると、PHPの置いてあるディレクトリにアップロードした
ファイルがコピーされます。
取得したファイル名とMIMEタイプも表示されるので、確認してください。
実際にプログラムを組むときは、ファイル名がすでに存在していて、上書きされる
場合もありますので、上書きされないようにする工夫も必要です。
★課題
1. サンプルプログラムを改良し、ファイルサイズが100キロバイトを超えたら、
エラーメッセージを表示するプログラムを作成してください。
2. サンプルプログラムを改良し、アップロードファイルのMIMEタイプが、
JPEG以外の形式だった場合に、エラーメッセージを表示するプログラムを作成して
ください。
★前回の課題の解答
1. HTML上に、メール送信者(text)、件名(text)、本文(textarea)のフォームを
作成し、POST送信で受け取って、自分のメールアドレスへ送信されるプログラムを
作成してください。
→下のサンプルを参照してください。
index.html
-----------------------------------------------------------------
<HTML>
<BODY>
<FORM action="send_mail.php" method="POST">
あなたのメールアドレス <INPUT type="text" name="mail_from"><br>
件名 <INPUT type="text" name="subject"><br>
本文 <textarea name="body" rows="5" cols="30"></textarea><br>
<INPUT type="submit" value="送信">
</FORM>
</BODY>
</HTML>
-----------------------------------------------------------------
send_mail.php
-----------------------------------------------------------------
<HTML>
<BODY>
<?
// メールヘッダ(送信者のメールアドレス)
$header = 'From: ' . $_POST["mail_from"];
// 宛先のメールアドレス
$mail_to = 'info@searchai.jp';
// 件名
$subject = $_POST["subject"];
// 本文
$mail_body = $_POST["body"];
// JISコードへ変換
$subject = mb_convert_encoding($subject, "JIS");
$mail_body = mb_convert_encoding($mail_body, "JIS");
// メール送信処理
if (mb_send_mail($mail_to, $subject, $mail_body, $header)) {
print "メール送信正常に処理しました。";
}
else {
print "メール送信に失敗しました。";
}
?>
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
宛先の$mail_toは、自分のメールアドレスを指定してください。
前回のレッスンのサンプルに、パラメータを渡すだけですので、それ以外の
説明はなくても分かるかと思います。
|