延迟填充session.upload_progress数据

时间:2013-10-12 16:35:05

标签: php jquery kohana session-variables

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

2 个答案:

答案 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设置来检索密钥,即

     

来源:http://php.net/manual/pt_BR/session.upload-progress.php