基于会话不工作的PHP + Javascript上传
我在使用buildroot嵌入式linux上的FastCGI运行lighttpd + PHP 5.4。 我前段时间写了一个修改后的PHP文件上传进度脚本,使用以下教程:http://phpmaster.com/tracking-upload-progress-with-php-and-javascript/ 我以前使用mod_php在Slackware Apache上工作,一切正常。基于会话不工作的PHP + Javascript上传
不幸的是,该脚本无法正常工作。我已经确保在php.ini session.upload_progress = On
和会话已启用。我已经通过使用两个简单的PHP文件来验证会话是否正常工作,如4.在这里发帖http://quirm.net/forum/topic.php?id=3950。
该脚本应该显示加载屏幕和文件上传的百分比。它通过每0.2秒发送progress.php
请求来实现。不幸的是,无论文件有多大(我使用〜13 MB文件进行测试,我已确保php.ini中的文件上传大小接受此大小)上传在第一次请求后结束,因为它返回100.我有debbuged进度.php,它看起来整个$ _SESSION变量是空的。
这里是我的HTML表单代码:
<form enctype="multipart/form-data" action="actions/upload_upgrade.php" method="post" target="hidden_iframe" onsubmit="upload_type='config'; startUpload('config_form')" id="config_form">
<p class="stdtext">
Select File:
<input type="hidden" name="type" value="config">
<input type="hidden" value="config_form"
name="<?php echo ini_get("session.upload_progress.name"); ?>">
<input type="file" size="35" name="userfile" />
<br><br>
<input type="submit" class="defaultbtn" name="Upload" value="Upload" onclick="showLoadingScreen(true)"/>
</p>
</form>
我的JavaScript代码(请注意,上传和响应处理功能具有普遍性,因为他们接受来自几种不同的形式上传了用于上传配置,固件等)。
function sendUploadRequest(form_name)
{
job_name="Upload";
var http = createRequestObject();
http.open("GET", "actions/progress.php?form_name="+form_name);
http.onreadystatechange = function() { handleResponse(http,"sendUploadRequest('"+form_name+"')"); };
http.send(null);
}
function startUpload(form_name)
{
showLoadingScreen(true);
postDataSync("actions/uw.php");
document.getElementById("loadingtext").innerHTML="Uploading file...";
setTimeout("sendUploadRequest('"+form_name+"')", 200);
}
function handleResponse(http,fun_name)
{
hideInfo();
var response;
if (http.readyState == 4)
{
response = http.responseText;
document.getElementById("loadingtext").innerHTML = response + "%";
if (response < 100)
{
setTimeout(fun_name, 200);
}
else
{
showLoadingScreen(false);
if(job_name=="")
printInfo("Job completed successfuly");
else
{
if(job_name=="Upload"&&upload_type=="config")
{
if(hidden_iframe.window.document.body.innerHTML=="SUCCESS")
{
printInfo(job_name+" completed successfuly");
showLoadingScreen(true);
document.getElementById("loadingtext").innerHTML="Restoring backup...";
var result=postDataSync("actions/extract_backup.php");
showLoadingScreen(false);
if(result.substring(0,5)=="ERROR")
{
printError("Error while extracting backup configuration:<br><br>"+result.substring(6));
}
else if(result.substring(0,7)=="SUCCESS")
{
printInfo("Backup configuration restored successfully");
}
else
{
printError("Unknown error while extracting backup. Please contact service.");
}
}
else
{
printInfo(job_name+" was not completed because of errors");
}
}
else
{
if(hidden_iframe.window.document.body.innerHTML=="SUCCESS")
printInfo(job_name+" completed successfuly");
else
printError(job_name+" was not completed because of errors");
}
}
}
}
}
function createRequestObject()
{
var http;
if (navigator.appName == "Microsoft Internet Explorer")
{
http = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
http = new XMLHttpRequest();
}
return http;
}
我的PHP代码progress.php:
<?php
session_start();
//print_r($_SESSION);
$key = ini_get("session.upload_progress.prefix") . $_GET['form_name'];
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;
}
在http://de3.php.net/manual/de/session.upload-progress.php有人说: “请注意,此功能不工作,当您的Web服务器通过FastCGI的运行过程中出现PHP。”
我没有看到任何'session_start()调用' – Nanne 2013-05-09 09:16:06
开始session_start() – 2013-05-09 09:16:35
感谢您的回应。我编辑过我的帖子,在progress.php中包含session_start()。在调试过程中,我在某个时候删除了它。不幸的是,这不是一个问题。我使用print_r打印出整个会话内容并检查了firebug中的响应 - $ _SESSION是一个空数组。 – Wookie88 2013-05-09 09:20:05