跟踪上传进度

时间:2014-03-01 16:37:36

标签: php upload progress

我想跟踪文件上传进度到我的服务器,所以我读了(German) article。我已经检查了我的PHP.ini:

session.upload_progress.enabled = 1
session.upload_progress.cleanup = 1
session.upload_progress.prefix = upload_progress_
session.upload_progress.name = PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.freq = 1%
session.upload_progress.min_freq = 1
upload_max_filesize = 128M

我开始编写一个非常简单的脚本,只显示一个表单并在提交时上传文件:

<!-- upload.php -->
<?php
    session_start();

    $maxSize = 10485760;
    $uploadName = "test";

    if (@$_POST["upload"] ?: 0) { // Check, if upload is in progress
        $t = getcwd() . "\\" . basename($_FILES["file"]["name"]);

        if ($_FILES["file"]["size"] > $maxSize) {
            echo "Upload " . (move_uploaded_file($_FILES["file"]["tmp_name"], $t) ? "succeeded" : "failed"); // Return, if upload is succeeded or failed
        }
    } else {
        ?>
            <form action="<?= basename(__FILE__); ?>" enctype="multipart/form-data" id="frmUpload" method="POST" target="upload">
                <input name="file" type="file" />
                <input type="submit" value="Upload" />
                <input name="MAX_FILE_SIZE" type="hidden" value="<?= $maxSize; ?>" />
                <input name="upload" type="hidden" value="1" />
                <input name="<?= ini_get("session.upload_progress.name"); ?>" type="hidden" value="<?= $uploadName; ?>" /> <!-- Set session name -->
            </form>
            <div style="display: none; ">
                <iframe id="upload"></iframe>
            </div>
        <?php
    }
?>

我的第二个脚本应该使用会话名称检查上传进度

// uploadProgress.php
<?php
    session_start();
    $pName = ini_get("session.upload_progress.prefix") . "test";
    echo json_encode(@$_SESSION[$pName] ?: []);
?>

我创建了一个10mb的文件,以确保上传时间长。每次我在上传运行时调用uploadProgress.php $_SESSION[$pName]都没有设置,我找不到我的错误。有没有我忽略的东西或我犯错的东西?

2 个答案:

答案 0 :(得分:1)

原谅我,因为我不习惯你正在使用的语法...不确定为什么你在IF语句中使用三元运算符,或者为什么要压制{{1} }和$_SESSION变量。

我的示例中唯一突出的是我没有看到$_POST的任何电话?

以下another article可能有所帮助。

答案 1 :(得分:0)

解决了这个问题。找到了一种使用JavaScript跟踪进度的方法。这是我的解决方案:

/**********************\
| Script of upload.php |
\**********************/
var ui = { elems: ["dUploads", "fFile", "frmUpload", "pbPercent", "pbUpload", "pbWrpUpload"] }; for (var n = 0; n < ui.elems.length; n++) { ui[ui.elems[n]] = document.getElementById(ui.elems[n]); } delete ui.elems;

function refreshUploads (files) {
    var tmp;
    while (tmp = dUploads.firstChild) {
        tmp.remove();
    }

    for (var file in files) {
        var a = document.createElement("a");
        a.setAttribute("href", "uploads/" + files[file]);
        a.setAttribute("target", "_blank");
        a.appendChild(document.createTextNode(files[file]));

        var div = document.createElement("div");
        div.appendChild(a);

        ui.dUploads.appendChild(div);
    }
}

ui.frmUpload.onsubmit = function (e) {
    e.preventDefault();

    var ajax = new XMLHttpRequest();
    var data = new FormData();

    data.append("ajax", 1);
    data.append("file", ui.fFile.files[0]);

    ajax.upload.onprogress = function (e) {
        var percent = Math.floor(e.loaded / e.total * 100) + "%";
        ui.pbUpload.style.left = percent;
        ui.pbPercent.style.left = percent;
        ui.pbPercent.innerHTML = percent;
    };

    ajax.onreadystatechange = function (e) {
        if (ajax.readyState == 4 && ajax.status == 200) {
            ui.pbWrpUpload.style.opacity = "0";
            refreshUploads(eval(ajax.responseText));
        }
    };

    ui.pbWrpUpload.style.opacity = "1";

    ajax.open("POST", "upload.php", true);
    ajax.send(data);
};

refreshUploads([]); // Normally all already existing files are loaded via PHP