0

アップロードされたファイルの進行状況を確認しようとしています。Session クラスを持つ Kohana フレームワークを使用していますが、アップロードの進行状況にはネイティブ PHP セッションを使用しています。session_start()Kohana の bootstrap.php を呼び出しています。これはsession_start()、すべてのページ要求で呼び出されることを意味します。

アップロード フォームが送信された後、1 秒待ってから PHP ファイルの呼び出しを開始し、 jQuery を使用してアップロードの進行状況を確認します$.ajax()

問題は、$_SESSION[$key]($key にはアップロード データのキーが含まれています) が PHP の最初の呼び出しで設定されていないことです。私はこれをかなりデバッグしてみましたsession_id()が、正しいセッション ID を返すので、セッションは間違いなく正しいものであり、アクティブです。また、アップロードの進行状況を確認する前に 1 秒待機しているので、タイミングの問題ではありません。が設定されていなくても続行することでこれを修正できます$_SESSION[$key]が、アップロードが完了したかどうかを確認する方法は、 が設定されていない場合です$_SESSION[$key]

これは複数ファイルのアップロードであるため、HTML フォームは jQuery を使用してオンザフライで作成されます。生成されたフォームの HTML は次のとおりです。

<form action="ajax/upload" id="form-HZbAcYFuj3" name="form-HZbAcYFuj3" method="post" enctype="multipart/form-data" target="frame-HZbAcYFuj3">
    <iframe id="frame-HZbAcYFuj3" name="frame-HZbAcYFuj3"></iframe>
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="HZbAcYFuj3">
    <input type="file" id="file-HZbAcYFuj3" name="photo" accept="image/jpeg,image/pjpeg,image/png,image/gif">
    <button type="button">+ Select Photo</button>
</form>

JavaScript が進行状況を確認するために呼び出す PHP は次のとおりです。

public function action_uploadprogress()
{
    $id = isset($_POST['id']) ? $_POST['id'] : false;

    if (!$id)
        throw new Kohana_HTTP_Exception_404();

    $progress = 0;
    $upload_progress = false;

    $key = ini_get("session.upload_progress.prefix") . $id;

    if (isset($_SESSION[$key]))
        $upload_progress = $_SESSION[$key];
    else
        exit('100');

    $processed = $upload_progress['bytes_processed'];
    $size = $upload_progress['content_length'];

    if ($processed <= 0 || $size <= 0)
        throw new Kohana_HTTP_Exception_404();
    else
        $progress = round(($processed / $size) * 100, 2);

    echo $progress;
}

jQueryajax()リクエストは次のとおりです。

this.send_request = function()
{
    $.ajax(
        {
            url: 'ajax/uploadprogress',
            type: 'post',
            dataType: 'html',
            data: { id: _this.id },
            success:
                function(data, textStatus, jqXHR)
                {
                    if (textStatus == "success")
                    {
                        if (data < 100)
                            setTimeout(_this.send_request, 1000);
                    }
                }
        }
    );
};
4

2 に答える 2