繁体   English   中英

Ajax / iFrame / FileSystemObject上传

[英]Ajax / iFrame / FileSystemObject Upload

我已经为我的应用程序构建了一个上传器,但是在某些方面很挣扎。

我的AJAX脚本每隔3秒就会调用我的ASP页面checkProgress.asp,以检查上传期间该文件夹中有多少文件,它还会检查其中是否存在一个名为complete.txt的txt文件。

计数完成后,它会使用诸如“文件2上传...”之类的内容将响应发送回AJAX脚本,三秒钟后它将发送“文件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

...继续评论

所以这就是我的理解。 Classic ASP为每个会话分配一个工作线程,因为Classic ASP对象是单线程的,因此在请求之间共享它们(存储在Session对象中)的唯一方法是每个会话都具有一个线程。 自然,这完全意味着您所看到的内容-所有其他请求都将被阻止,直到上传完成。

解决该问题的方法是退出会议。 不幸的是,会话cookie仅限于HTTP(出于安全原因),因此我认为没有办法将其从AJAX请求中删除。

您可以使IIS条目响应另一个主机名,然后将AJAX请求转换为该第二个主机名的JSONP请求。 我不确定是否有更优雅的方法。

==================

编辑:实际上,我收回了有关cookie的部分。 您肯定可以通过给ajax()调用加上headers:{Cookie:""}来杀死它们? 值得一试....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM