javascript - Ajax/iFrame/FileSystemObject 上传

标签 javascript jquery ajax asp-classic

我已经为我的应用程序构建了一个 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/

相关文章:

javascript - IdentityServer Authentication AspCore 和 Angular Client 最佳实践

javascript - 如何在 Rails 3 应用程序中插入 CKEditor 插件?

javascript - 从 javascript 获取上下文路径

javascript - 我的 jQuery Cookie 无法在 DIV 隐藏上工作

javascript - cometd 事件不那么频繁

javascript - HTML 弹出窗口修复

javascript - 当用户在只有一个输入的表单中点击 Enter 时,避免 "submit"

javascript - jQuery hide() 方法在 IE8 中不会立即生效?

javascript - 我的 Highchart 偶尔显示(绘制)我的数据,而不是从左到右以干净的线条显示

java - 根据请求使用不同的 View 解析器