通过AJAX提交文件上传表单导致没有$_SESSION[upload_progress]
数组,而正常提交则表示没有xmlHttpRequest
数组。如何强制创建/允许访问以显示上载完成百分比。像iframe和XRH2这样的替代方案是最好的方法吗?
我有一个上传功能,使用upload.php
按upload.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 +的唯一解决方法(可能更早,我还没有考虑过)。