[ PHP ] F5 による連続ファイルアップロードを制御する ( $_SESSION )

Pocket

PHP で、ファイルのアップロード処理は容易に実現できます。しかし、ブラウザの再表示 ( F5 ボタン ) の制御を行わないと、同一ファイルが連続してアップロードされてしまい問題となることもあると思います。ここでは、このようなブラウザの再表示の問題をセッションを使って制御するサンプルを掲載しています。

スポンサーリンク

F5 でのファイルアップロードを制御する

再表示 ( F5 ) を制御するサンプルになります。詳細はサンプル内のコメントを参照ください。

// ページ表示時間を取得
$pageviewtime = time();
// セッションの開始
session_start();

// POST に ページ出力時間が設定されているか確認する(2回目以降の表示)
if(isset($_POST['pageviewtime'])) {

    // セッション内のページ出力時間を取得
    $time_in_sess = $_SESSION['pageviewtime'];
    // POST のページ出力時間を取得
    $time_in_post = $_POST['pageviewtime'];
    
    if($time_in_sess > $time_in_post) {
        /*
         *  POSTとセッション内に保持するページ表示時間が異なる場合は、再表示(F5)であると判断し、
         * ファイルのアップロード処理は行わない
         */
    } else {
        /*
         * この位置でファイルのアップロード処理
         */
    }
}

// セッションにページ表示時間を格納する
$_SESSION['pageviewtime'] = $pageviewtime;

// ページを出力する
view($pageviewtime);

function view($pageviewtime)
{
echo <<< HTML
    <html>
        <head>
            <title>再表示でのファイルアップロードを抑制する</title>
        </head>
        <body>
            <form action="reload.php" enctype="multipart/form-data" method="post">
                <input name="upfile" type="file" />
                <input type="submit" value="アップロード" />
                <input type="hidden" name="pageviewtime" value="$pageviewtime" />
            </form>
        </body>
    </html>
HTML;
}

サンプルコードの概要

  • ページを出力した際に、HTML の hidden 項目に時間を出力して、セッションにも同一の時間を保存しておく
  • 最初のアップロードの場合は、POST の時間とセッションの時間が等しいのでファイルのアップロード処理を行う
  • セッションに保存するページ出力時間は常に更新する
  • この状態でブラウザの再表示(F5)が行われると、hidden 項目の時間は前回の post 時の時間であり、 サーバで管理するセッションに保持する時間と差異があるので、サーバでは再表示と判断することができる
参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *