我正在尝试检查上传文件的进度。我正在使用具有Session类的Kohana框架,但是对于上传进度,我使用的是本机PHP会话。我在Kohana的bootstrap.php中调用session_start()
,这意味着每个页面请求都会调用session_start()
。
提交上传表单后,我等待1秒,然后开始调用PHP文件,使用jQuery $.ajax()
检查上传进度。
问题是第一次调用PHP时没有设置$_SESSION[$key]
($ key包含上传数据的密钥)。我已经尝试了相当多的调试,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);
}
}
}
);
};
答案 0 :(得分:1)
让我们看看我是否能获得一些甜蜜的赏金。我首先想到的是$ key字符串没有正确设置。
尝试回显其值并在整个$ _SESSION变量上执行print_r以跟踪事物。
现在我根本没有看到action_uploadprogress()的'成功'输出。我看到100我猜想已完成,但你没有在js中检查。我建议调查一下。不妨回应你的计算。我认为它不太可能,但请确保您正确上传文件,并能够毫无问题地确定其当前大小。
另一个问题可能是您如何使用jquery处理ajax。我不是100%肯定这一点,但我认为成功选择已经折旧(1.5 +)。
来自:http://api.jquery.com/jQuery.ajax/
$.ajax({
type: "POST",
url: "some.php",
data: { name: "John", location: "Boston" }
}).done(function( msg ) {
alert( "Data Saved: " + msg );
});
我看到成功使用的唯一方法就是这样....
$.ajax({
type: "POST",
url: '/login/spam',
data: formData,
success: function (data) {
if (data == 'value') {
//Do stuff
}
}
});
但是我可能完全错了....你的设置可能完全没问题。我想让你做的是直接在成功/完成功能
alert(data);
alert(textStatus); //if you still use it
这将告诉您是否从ajax查询中获得了正确的答案。
今晚我会回来几次,明天我会来帮忙。告诉我,如果我说的话有什么帮助。
答案 1 :(得分:1)
您正在向PHP脚本发送名为“id”的POST。
但是,文档说只有在发送与php.ini中配置的session.upload_progress.name同名的POST时才能使用上传进度。
因此,换句话说,如果您的session.upload_progress.name设置为默认值(PHP_SESSION_UPLOAD_PROGRESS),则必须在send_request函数中更改以下行:
更改:
data: { id: _this.id }
要:
data: { PHP_SESSION_UPLOAD_PROGRESS: _this.id }
您还必须在PHP脚本中将$_POST['id']
更改为$_POST['PHP_SESSION_UPLOAD_PROGRESS']
或$_POST[ini_get("session.upload_progress.name")]
(如果它不是默认值,也会更改输入名称。)
当上传正在进行时,以及当session.upload_progress.name INI设置设置为POST的同名变量时,上传进度将在$ _SESSION超全局中可用。当PHP检测到此类POST请求时,它将填充$ _SESSION中的数组,其中索引是session.upload_progress.prefix和session.upload_progress.name INI选项的连接值。通常通过读取这些INI设置来检索密钥,即