PHPでファイルのアップロードを扱う

流れ

  1. リファラーを利用して、特定のページから移動してきたことを確認する。
  2. アップロード作業の成否を確認。($_FILESのerrorを確認)
  3. pathinfoメソッドなどを利用して拡張子を確認。
  4. ファイルの内容をfinfo_fileメソッド等を利用して確認。
  5. アップロードされた一時ファイルを正式なファイルとして、保存場所へ保存。
  6. ページ移動などの処理を行い終了。

参考Webページ

$_FILES について

概要

HTTP POST を利用したアップロード時に使われるスーパーグローバル変数。
2次元配列の構造を持つ。
var_dump($_FILES) を使えば構造は把握できる。
複数ファイルを同時にアップロードする場合、
HTMLのinputタグにmultiple属性を付与して、nameの要素名の最後に[]を加えれば良い。
php.ini の upload_tmp_dir ディレクティブで一時ファイルの保存先を指定できる。

書式

$_FILES['要素名']['情報名']

要素名はHTMLのinputタグのnameで指定された文字列。
(例:<input type=”file” name=”upfile”> なら、要素名はupfileになる)

情報名については次の表の通り。

情報名
概要
nameクライアントマシン上でのオリジナルのファイル名。
typeアップロードファイルのコンテンツタイプ。MIME型。このMIME型はPHPではチェックされないので、この値は信用しない方が良い。
sizeバイト単位のサイズ。
tmp_nameサーバ上に一時保存された時の一時ファイル名。
errorアップロード時に発生したエラーのコード。
定数
概要
UPLOAD_ERR_OK0アップロード成功。
UPLOAD_ERR_INI_SIZE1php.ini のupload_max_filesize パラメータの指定サイズを超過。
UPLOAD_ERR_FORM_SIZE2HTMLフォームで指定したサイズを超過。
UPLOAD_ERR_PARTIAL3ファイルは一部のみしかアップロードされていない。
UPLOAD_ERR_NO_FILE4ファイルが存在しない。
UPLOAD_ERR_NO_TMP_DIR6一時保存のためのフォルダが存在しない。
UPLOAD_ERR_CANT_WRITE7ディスクへの書き込みに失敗した。
UPLOAD_ERR_EXTENSION8拡張モジュールによってアップロードが中断された。読み込まれている拡張モジュールの一覧をphpinfo()で取得すれば参考にできる。

php.ini での設定項目について

パラメータ名
概要
規定値
file_uploadsアップロードを有効にするかどうか。1
max_file_uploads同時にアップロードできるファイルの最大数。20
upload_max_filesizeアップロード可能な最大サイズ。2M
upload_tmp_dirアップロードファイルを一時的に保存するためのフォルダ。
post_max_sizeポストデータとして送信可能な最大サイズ。8M
memory_limit利用可能なメモリサイズ。厳密には1プロセス(または1スクリプト)が確保できる最大メモリサイズ(バイト単位)制限したくない場合は -1 を指定する。128M
max_execution_timeスクリプトの最大実行時間(秒単位)30
max_input_timeスクリプトが入力処理に利用できる最大時間(秒単位)-1 (-1 なら、max_execution_timeの値)

動作確認用コード(各種確認の処理は省略)

概要

XAMPPを利用して環境構築をしている。PHPは8.2.4を利用している。
ファイルサイズ1MB以下ぐらいの画像ファイルを用意して、
アップロードが無事成功していることを確認すれば良い。
Upload.php の最後のリダイレクトをコメントアウトすれば詳細が見られる。

Upload.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Upload.html</title>
    </head>
    <body>
        <form method="post" action="upload.php" enctype="multipart/form-data">
            <label for="upfile">アップロードするファイルを選択</label><br>
            <input type="file" name="upfile" id="upfile"><br>
            <input type="submit" value="アップロード">
        </form>
    </body>
</html>

Upload.php

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Upload.html</title>
    </head>
    <body>
        <b>var_dump($_FILES)の結果</b><br>
        <?php
            var_dump($_FILES);
        ?>
        <br><br>
        <b>$_FILESの内容を表示</b><br>
        <?php
            foreach($_FILES['upfile'] as $key => $value) {
                print($key . ' : ' . $value . '<br>');
            }
        ?>
        <br><br>
        <b>$_SERVER['REQUEST_METHOD']を表示。</b><br>
        <?php
            print($_SERVER['REQUEST_METHOD'] . '<br>');
        ?>
        <br><br>
        <?php
            // アップロード後のサーバ内での処理。
            // アップロードされたファイルの一時ファイル名を取得。
            $temp = $_FILES['upfile']['tmp_name'];
            print('$temp = ' . $temp . '<br>');
            // アップロードされたファイルの元の名前を取得。
            $file_name = $_FILES['upfile']['name'];
            print('$file_name = ' . $file_name . '<br>');
            // // 一時ファイルから正式なファイルとして保存。
            if (!move_uploaded_file($temp, $file_name)) {
                $err_msg = '一時ファイルから移動する時に失敗しました。';
            }

            // // エラーが発生した場合に表示して終了。
            if (isset($err_msg)) {
                die($err_msg);
            }

            // 処理成功後はリダイレクト。
            // 動作確認時はリダイレクトする箇所をコメントアウトすると良い。
            print('http://' . $_SERVER['HTTP_HOST'] . '/Upload.html');
            header('Location: http://' . $_SERVER['HTTP_HOST'] . '/Upload.html');

        ?>
        <br>
    </body>
</html>

コメント

タイトルとURLをコピーしました