アップロードされたファイルの進行状況を確認しようとしています。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);
}
}
}
);
};