[英]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.