「使用する関数についてしっかりと理解しておきたい」
このように、PHPの学習を始めたばかりの場合ファイルのアップロード方法について、まだよく理解できていない方も多いかと思います。
実はファイルのアップロードはあまり難しくありませんのでこの機会にしっかりと覚えておきましょう。この記事でファイルアップロード時に使用する関数などについて、詳しくご紹介していきます。
目次
PHPでファイルをアップロードする方法
では早速、PHPでファイルをアップロードする方法についてご紹介していきます。
アップロードにはPOSTメソッドを使用し、POSTには英語で「郵便」という意味があります。つまり “ファイルを送る” というイメージですね。
htmlのフォーム入門【 form,get,post 】メソッドとは関数の一種で、よく利用される処理を予め定義したものとなります。
そのようなPOSTメソッドを利用してファイルをアップロードするためには、以下の2つの手順を踏む必要があります。
- HTMLからPHPへファイルデータを送信
- PHP側でファイルデータをアップロード
HTMLからPHPへファイルデータを送信
ファイルアップロードには、まずフォームを記述する際に特別な指定が必要になります。今回はアップロード時、up.phpというファイルにアップロードする場合の書き方をご紹介します。
1 2 3 4 |
<form action="up.php" method="post" enctype="multipart/form-data"> <input type="file" name="webkatsu"> <input type="submit" value="アップロード"> </form> |
HTMLのformタグはenctype属性で、multipart/form-dataを指定します。form要素のenctype属性は送信データのエンコード・タイプを指定し、form要素のmethod属性がpost
の時だけ使用します。
PHP側でファイルデータをアップロード
次は、送られたファイルをPHP側で処理する必要があります。
PHPでは$_FILES[name]にアップロードされたファイルのデータが入り、nameはfileのinputタグに付けられた名前となります。
今回の例では「webkatsu」がその例です。
1 |
$_FILES['webkatsu'] |
上記の部分に様々なデータが格納され、これは連想配列になります。
ファイルは”一時ファイル名”と”本来のファイル名”があります。以下の例を見てください。
1 2 |
$tempfile = $_FILES['fname']['tmp_name'] // 一時ファイル名 $filename = $_FILES['fname']['name'] // 本来のファイル名 |
【PHP】連想配列のキーや値を取得する方法を解説
アップロードされたファイル名について
先ほどの手順でアップロードされた処理は、phpスクリプトが呼び出された時点で終わっています。そして既にファイルとしてサーバ上に存在し、そのファイル名が一時ファイル名(tmp_name)になります。
この一時ファイル名は適当な名前が付けられますが、本来のファイル名はnameキーで指定した名前が入ります。
一連の流れでアップロードされたファイルは、一時的な場所にあるファイル。そのためこれを本来格納したい場所にファイルを移動する処理を、次にご紹介します。
ファイルの確認と移動方法
ではファイルの確認・移動方法についてご紹介します。下記のコードを記述してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $tempfile = $_FILES['fname']['tmp_name']; $filename = './' . $_FILES['fname']['name']; if (is_uploaded_file($tempfile)) { if ( move_uploaded_file($tempfile , $filename )) { echo $filename . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?> |
アップロードされたファイルが正常に処理されたかどうかを確認するために、is_upload_file関数を使用します。これはセキュリティ対策も兼ねているため、必ず確認しましょう。
続いてmove_uploaded_fileにてファイルを移動させることが可能です。今回は移動先にphpスクリプトと同じディレクトリに本来のファイル名で配置していますが、実際の開発ではファイル用のディレクトリを作成し、移動させるようにしましょう。
補足:セキュリティ対策について
フォームなど、ユーザーから任意の値が送られることもあるでしょう。その際、処理によっては悪意のあるファイルをそのままアップロードされる場合があるためで、より安全面を意識して開発を行う必要があります。
ファイル名の決め方
送られてきたファイルを、そのファイル名のままでサーバーに保存するコードの記述もありますが、それではセキュリティ面で不安が残ってしまいます。下記のように記述してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php try{ if(is_uploaded_file($_FILES['file']['tmp_name'])){ move_uploaded_file($_FILES['file']['tmp_name'], './img/'.$_FILES['file']['name']); } }catch(Exception $e) { echo 'エラー:', $e->getMessage().PHP_EOL; } ?> <form action="./error_check1.php" method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="ファイルをアップロードする"> </form> |
ファイル名を決める際は、このようにユーザーからの入力値を使用するのではなく、プログラム側で指定するようにしましょう。これはセキュリティ対策のほか、すでにアップロードされたファイルとファイル名が被らないようにする目的も兼ねています。
アップロードできるファイルの拡張子を制限
通常ファイルのアップロードは、どのような形式のファイルもアップロードできる仕組みです。しかしPHPのファイルをアップロードさせてサーバ上で実行したり、拡張子がexeの実行ファイルをアップロードさせて他のユーザーにダウンロードさせてしまう可能性があるため、セキュリティ事故につながる恐れがあります。
多くの場合アップロードファイルは、画像などの特定の種類に限定されます。jpgやpng、gifなどに拡張子を限定し、それ以外のアップロードは拒否する設定をしておきましょう。
まとめ
いかがでしたか?
今回の記事では、「PHPでファイルをアップロードする方法」についてご紹介しました。
アップロードにはPOSTメゾットを使用します。セキュリティ対策なども考え、今後PHPでファイルアップロードを行う際に役立てていきましょう!