PHPでファイルアップロードを実装する方法

Webサイトでファイルをアップロードし、PHPで処理を行う方法は難しそうに思えますが実は簡単です。PHPにはファイルアップロードに関する機能が内蔵されており、特別難しいことを行わなくてもフォームからファイルのアップロードを行うことができます。

フォームの書き方

ファイルのアップロードを行う場合、まずフォームを書くときに特別な指定が必要になります。ファイルを up.php というファイルにアップロードする場合の書き方を見てみます。

<form action="up.php" method="post" enctype="multipart/form-data">
  <input type="file" name="fname">
  <input type="submit" value="アップロード">
</form>

form タグにはenctype属性で multipart/form-data を指定します。これにより、アップロードが可能となります。

ファイルを選択するinputタグのtypeは file です。このタグにこの例では「fname」と名前を付けています。

PHP側での処理

次にPHP側でどのような処理を行うかを見てみます。PHPでは $_FILES[name] にアップロードされたファイルに関する各種データが入ります。ここでの name はfileのinputタグに付けられた名前です。つまり、今回の例では「fname」になります。つまり

$_FILES['fname']

にさまざまなデータが格納されます。これは連想配列です。例えばtmp_nameにアップロードされた一時ファイル名、 nameに本来のファイル名が入ります。

$tempfile = $_FILES['fname']['tmp_name'] // 一時ファイル名
$filename = $_FILES['fname']['name'] // 本来のファイル名

アップロードされたファイル名

アップロード処理はphpスクリプトが呼び出された時点で終わっており、既にファイルとしてサーバ上に存在します。そのファイル名が一時ファイル名(tmp_name)です。これは適当な名前が付けられています。本来のファイル名は name キーでわかります。

アップロードされたファイルは一時的な場所にあるファイルなので、これを本来格納したい場所にファイルを移動する処理を行います。

ファイルの確認と移動

ファイルの移動は以下のように行います。

<?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スクリプトと同じディレクトリに本来のファイル名で配置しています。しかし実際にはファイル用のディレクトリを作成して置いた方が良いでしょう。

まとめ

ファイルアップロードはPHP側で書かなくてはいけない処理はアップロードされたファイル名の取得とその移動だけです。定型処理でもありますし、簡単にファイルのアップロードを処理することができます。画像のアップロードなどはよく利用する機能ですので、これを使って取り入れるとよいでしょう。