我已经为我的应用程序构建了一个上传器,但在某些方面遇到了困难。
每隔3秒,我的AJAX脚本就会调用我的ASP页面checkProgress.asp,检查上传过程中该文件夹中有多少个文件,它还会检查那里是否有一个名为complete.txt的txt文件。
计数完成后,它会向AJAX脚本发送一个类似于“File2 uploaded...”的响应。3秒后,它将发送“文件3已上传...”,依此类推。如果找到complete.txt文件,它将返回"Complete“,而不是计数。这一次运行得很好,之后似乎就不能正常运行了。我得到了应该得到的“完成”消息,但没有得到文件计数进度响应。
我用一个新的浏览器窗口手动运行checkProgress页面,以查看为什么我的进度面板没有随着进度更新,并注意到浏览器加载图标正在旋转,当上传完成时,“完成”弹出。因此,AJAX调用没有到达页面以收集文件计数,因为它很忙,这让我感到困惑,因为该页面所做的只是计算文件夹中有多少文件。
有人能建议我哪里做错了吗?当文件夹被添加到其中时,这是不会发生的吗?
下面是我的AJAX脚本。这在上传开始时开始:
var upload1ProgressCheckInt = setInterval(function() {
var postData = "token="+token;
$.ajaxSetup ({ cache: false });
$.ajax({ type : 'GET', url : 'ajax/checkProgress.asp',
dataType : 'html', data : postData,
success : function(data) {
if (data == "Failed") {
$('#upload1ProgressStatus').html('Error: Upload cancelled!');
clearInterval(upload1ProgressCheckInt);
// do stuff
} else if (data == "Complete") {
$('#upload1ProgressStatus').html('Success: Files uploaded');
clearInterval(upload1ProgressCheckInt);
// do stuff
} else {
$('#upload1ProgressStatus').html(data);
}
}
}); // end ajax
}, 3000);这是checkProgress.asp页面:
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
If (FSO.FileExists(Server.MapPath("../files/photos/"&token_&"/complete.txt"))) = True Then
Response.Write "Complete"
Else
Set folder = FSO.GetFolder(Server.MapPath("../files/photos/"&token_&"/"))
Set files = folder.Files
fileCounter = files.Count
Response.Write "File "&fileCounter&" uploaded..."
End If发布于 2012-01-22 13:24:49
来自评论的...continuing。
所以我是这样理解它的。Classic ASP为每个会话分配一个工作线程,因为Classic ASP对象是单线程的,因此在请求之间共享它们(存储在session对象中)的唯一方法是为每个会话分配一个线程。当然,这就是你所看到的--所有其他的请求都会被阻塞,直到上传完成。
解决这个问题的方法是中断会话。不幸的是,会话cookie是纯HTTP的(出于安全原因),所以我不认为有一种方法可以将它从AJAX请求中删除。
您可以使您的IIS条目响应另一个主机名,并将AJAX请求转换为对该第二个主机名的JSONP请求。我不确定是否有一种更优雅的方式。
==================
编辑:实际上我收回了关于cookie的部分。你当然可以通过在你的ajax()调用中加入headers:{Cookie:""}来杀死他们?值得一试...
https://stackoverflow.com/questions/8958740
复制相似问题