我正在尝试检查上传文件的进度。我正在使用具有 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);
}
}
}
);
};