HTMLフォームでファイルを送信したい時、いつものフォームだけではできません。

いつものフォームでは、【send_mail】関数などでメールに送るだけですが、ファイルを添付して送信する場合、サーバにファイルを置くという手間が加わります。

【form.html】

[code language=”css”]
<html lang"ja">
<head>
<meta charset"UTF-8">
<title>HTMLフォーム:ファイル添付</title>
</head>
<body>
<form action"upload.php" method"post" enctype"multipart/form-data">
ファイル:<br>
<input type"file" name"upfile" size"30"><br>
<input type"submit" value"アップロード" />
</form>
</body>
</html>
[/code]

HTMLフォームからファイルを受け取る場合、【upload.php】を作成します。

【upload.php】

[code language=”css”]
<html lang"ja">
<head>
<meta charset=utf-8">
<title>sample</title>
</head>
<body>
<?php
//↓uploadファイルの有り無し確認
if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
//↓有効なファイルかどうかを検証し、問題なければ名前を変更しアップロード完了
if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) {
chmod("files/" . $_FILES["upfile"]["name"], 0644); //パーミッション設定
echo $_FILES["upfile"]["name"] . "をアップロードしました。";
} else {
echo "ファイルをアップロードできません。";
}
} else {
echo "ファイルが選択されていません。";
}
?>
</body>
</html>
[/code]

アップロードされたファイルの情報は【$_FILES】に格納されます。
【$_FILES】は【$_POST】や【$_GET】と同様、PHPが自動的に値をセットしてくれます。アップロードしたファイルは一時的にサーバー側に保存され、PHPプログラムの実行が終了すると削除されます。

入力項目の name 属性を upfile にして送信した場合、ファイルの名前は【$_FILES[“upfile”][“name”]】とすれば取得する事ができます。
また、一時的にサーバー側へ保存されたファイルの名前は【$_FILES[“upfile”][“tmp_name”]】とすれば取得する事ができます。

注意する点として、もしコピー先のファイルが既に存在する場合、上書きされてしまうので、被らないように連番などを加えると間違いないと思います。

また、upload.php と同じ場所に files フォルダを作成し、書き込み権限を与えておきます。(パーミッションを 777 に設定します。)

【is_uploaded_file】はファイルがアップロードされたかどうか調べる関数です。アップロードされていなければ「ファイルが選択されていません。」と表示しています。

また、【move_uploaded_file】はアップロードファイルを移動する関数です。
移動元のファイルは【$_FILES[“upfile”][“tmp_name”]】です。これはPHPによって一時的に作成されたアップロードファイルの名前です。
移動先は【”files/” . $_FILES[“upfile”][“name”]】です。これで files フォルダの中にオリジナルのファイル名でアップローファイルが保存されます。

chmod はパーミッションを設定する関数です。後でファイルを削除できるように、念のため 644 に設定しています。

これで【form.html】にアクセスし、アップロードボタンを押すと files フォルダ内にファイルがアップロードされます。