我想检查上传的文件的进度。我使用的是具有Session类的Kohana框架,但对于上传进度,我使用的是原生PHP会话。我在Kohana的bootstrap.php中调用session_start()
,这意味着每个页面请求都会调用session_start()
。延迟填充session.upload_progress数据
上传表单提交后,我等了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;
}
这里是jQuery的ajax()
要求:
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);
}
}
}
);
};
你在哪里设置send_request.id? –
为什么echo而不是$ this-> response-> body($ progress)? – Darsstar