0

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

2 回答 2

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 查询中得到正确的响应。

我今晚会回来检查几次,明天我会在附近帮忙。告诉我我说的话是否有帮助。

于 2013-10-14T21:02:20.913 回答
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 }

您还必须更改$_POST['id']to$_POST['PHP_SESSION_UPLOAD_PROGRESS']$_POST[ini_get("session.upload_progress.name")]PHP 脚本(以及输入的名称,以防它不是默认值)。

当上传正在进行时,上传进度将在 $_SESSION 超全局中可用,并且在发布与 session.upload_progress.name INI 设置设置为相同名称的变量时。当 PHP 检测到此类 POST 请求时,它将在 $_SESSION 中填充一个数组,其中索引是 session.upload_progress.prefix 和 session.upload_progress.name INI 选项的连接值。通常通过读取这些 INI 设置来检索密钥,即

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

于 2013-10-14T22:19:37.970 回答