我已经为我的应用程序构建了一个 uploader ,但在某些事情上遇到困难。
每隔 3 秒,我的 AJAX 脚本就会调用我的 ASP 页面 checkProgress.asp,以检查上传过程中该文件夹中有多少文件,它还会检查其中是否有名为 complete.txt 的 txt 文件。
计数完成后,它会将响应发送回 AJAX 脚本,其中包含“文件 2 已上传...”之类的内容,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
最佳答案
...继续评论。
我是这样理解的。经典 ASP 为每个 session 分配一个工作线程,因为经典 ASP 对象是单线程的,因此在请求之间共享它们(存储在 session 对象中)的唯一方法是为每个 session 使用一个线程。当然,这正是您所看到的 - 所有其他请求都被阻止,直到上传完成。
解决这个问题的方法是中断 session 。不幸的是, session cookie 仅适用于 HTTP(出于安全原因),因此我认为没有办法将其从 AJAX 请求中删除。
您可以让您的 IIS 条目响应另一个主机名,并将您的 AJAX 请求转换为对第二个主机名的 JSONP 请求。我不确定是否有更优雅的方式来做到这一点。
==================
编辑:实际上我收回关于 cookie 的部分。您肯定可以通过将 headers:{Cookie:""}
传递给您的 ajax()
调用来杀死它们吗?值得一试....
关于javascript - Ajax/iFrame/FileSystemObject 上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8958740/