使用ajax上传PHP文件而不更新会话[upload_progress] cookie

时间:2014-07-11 16:39:40

标签: javascript php ajax session file-upload

快速版

通过AJAX提交文件上传表单导致没有$_SESSION[upload_progress]数组,而正常提交则表示没有xmlHttpRequest数组。如何强制创建/允许访问以显示上载完成百分比。像iframe和XRH2这样的替代方案是最好的方法吗?

慢版

我有一个上传功能,使用upload.phpupload.php上传多个文件。然后将这些压缩在form中,并使用压缩文件的URL更新数据库。

与此平行,我在第一个旁边有另一个upload.php,它直接提交upload.php(与之比较)与相同的处理(AJAX)。文件上传适用于两者,但我希望获得进度%并通过AJAX表单进行额外控制。我知道我可以使用XHR2进度和加载等事件监听器,但我没有那么好运,我不相信它们也符合IE9标准。

因此,我希望使用单独的uploadProgress.php调用<!--Standard form --> <form method="post" enctype="multipart/form-data" id="manualUpload" action="homeworkUpload.php"> <input type="hidden" value="file-item" name="<?php echo ini_get("session.upload_progress.name"); ?>"> <input type="file" name="files[]" id="uploadFiles" multiple="multiple" /> <button type="submit" id="btn">Upload your work</button> </form> <!--AJAX form --> <form id="file-form" action="homeworkUpload.php" method="POST"> <input type="hidden" value="file-item" name="<?php echo ini_get("session.upload_progress.name"); ?>"> <input type="file" id="file-select" name="files[]" multiple/> <button type="submit" id="upload-button">Upload</button> </form> <div id="bar_blank">0%</div> 来查询进度。我应该可以通过使用会话cookie来实现这一点,会在上传文件时创建各种session values

function loadXMLDoc(url,method="GET",fd="",cfunc) {
    if (window.XMLHttpRequest) {xmlhttp=new XMLHttpRequest();}
    else {xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}

    xmlhttp.onreadystatechange=cfunc;

    xmlhttp.open(method,url,false); 
    xmlhttp.send(fd);
}

一般AJAX功能

document.querySelector("#file-select").addEventListener('change',function(e) {
    var files = fileSelect.files;
    var formData = new FormData();

    document.getElementById('upload-button').innerHTML = 'Uploading...';

    for (var i = 0; i < files.length; i++) {
        var file = files[i];
        formData.append('files[]', file, file.name);
    }

    loadXMLDoc("homeworkUpload.php", "POST", formData, function(){
        if (xmlhttp.readystate == 4 && xmlhttp.status==200){
            document.getElementById('upload-button').innerHTML = "Upload";
            var response = xmlhttp.responseText; // post error messages too
            alert(response);
        }
    });

    setTimeout("uploadProgress()",1000);    
},false);

主要上传功能

function uploadProgress(){
    loadXMLDoc("uploadProgress.php", "POST", "", function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            var percentComplete = xmlhttp.responseText;
            document.getElementById('bar_blank').innerHTML = percentComplete+"%";
            if (percentComplete < 100){
                setTimeout(uploadProgress, 1000);
            }
        }
    });
}

Javascript上传进度

$key = ini_get("session.upload_progress.prefix") . "file-item";
if (!empty($_SESSION[$key])) {
    $current = $_SESSION[$key]["bytes_processed"];
    $total = $_SESSION[$key]["content_length"];
    echo $current < $total ? ceil($current / $total * 100) : 100;
}
else {
    echo 100;
}

PHP上传进度

print_r($_SESSION)

当我通过直接表单提交上传大文件时,我可以执行AJAX并在刷新屏幕时观察字节更改。当然,通过直接提交,页面会挂起,直到我完成上传(20秒),所以无论如何我都无法在起始页面上访问这些变量。所以XHR是显而易见的方法,但是当我使用uploadProgress.php提交时,会话变量不会被创建,我也无法以这种方式进行任何处理!因此,$_SESSION只会立即返回100%,而不管由于空AJAX变量而导致实际完成。

当我进行<iframe>调用时,什么阻止会话变量被创建?我该如何改变? {{1}}是IE9 +的唯一解决方法(可能更早,我还没有考虑过)。

0 个答案:

没有答案