2012-01-22 2 views
2

Я создал загрузчик для своего приложения, но что-то борюсь.Ajax/iFrame/FileSystemObject Загрузить

Каждые 3 секунды мой сценарий AJAX вызывает вызов моей страницы ASP, checkProgress.asp, чтобы проверить, сколько файлов находится в этой папке во время загрузки, а также проверяет, есть ли там файл txt с именем complete.txt.

Когда счетчик выполнен, он отправляет ответ на сценарий AJAX с чем-то вроде «File 2 uploaded ...», а через 3 секунды он отправит «File 3 uploaded ...» и так далее. Если файл complete.txt был найден, он будет возвращать «Завершить» вместо подсчета. Это работало нормально, один раз, а затем, похоже, не работало должным образом после этого. Я получаю «полное» сообщение, как и следовало бы, но не получаю ответ на запрос количества файлов.

Я запустил страницу checkProgress вручную с новым окном браузера, чтобы узнать, почему моя панель прогресса не обновлялась с прогрессом, и заметила, что значок загрузки браузера просто вращается, и когда загрузка завершена, выдается «Complete» , Таким образом, вызов 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 
+0

Это звучит как проблема с резьбой. Вы сохраняете что-либо в объекте Session? Если да, попробуйте избавиться от этого кода и посмотрите, заблокирован ли рабочий поток. –

+0

@Ilia G - да, у меня есть информация для входа, хранящаяся в переменных сеанса. Я только что заметил, весь мой сайт не будет работать до тех пор, пока загрузка не завершится – TheCarver

+0

Собственно, не весь мой сайт, только часть, с которой я вошел в систему по сессиям – TheCarver

ответ

1

... продолжается от комментариев.

Так вот, как я это понимаю. Классический ASP присваивает рабочий поток каждому сеансу, потому что классный объект ASP однопоточен, и, таким образом, единственный способ их совместного использования (хранимый в объекте Session) между запросами - иметь отдельный поток для каждого сеанса. Естественно, это означает, что именно вы видите - все остальные запросы блокируются до тех пор, пока загрузка не завершится.

Путь к работе вокруг этого - выйти из сеанса. К сожалению, cookie сеанса HTTP-only (по соображениям безопасности), поэтому я не думаю, что есть способ отбросить его из запроса AJAX.

Вы можете сделать запись в IIS ответом на другое имя хоста и преобразовать запрос AJAX в запрос JSONP этому второму имени хоста. Я не уверен, есть ли более грациозный способ сделать это.

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

EDIT: На самом деле я забираю часть о печенье. Вы можете убить их, указав headers:{Cookie:""} на ваш звонок ajax()? Стоит попробовать ....

+0

Интересно, спасибо за ваши усилия. Выйти из сессии было возможно. Я собираюсь поиграть с этим, может дать мне лучшее понимание. Назад в ближайшее время – TheCarver

+0

Ты звезда, большое спасибо! Я покинул сессию (сессия.Abandon) незадолго до того, как сценарий загрузки запустился, и, вернее, у нас есть индикация прогресса. Но теперь мне нужно разобраться, чтобы воссоздать сеанс, когда загрузка завершена. – TheCarver

+0

@MartinG Как я уже сказал, я думаю, вы можете уйти, просто установив заголовок «Cookie» на ваш запрос ajax на пустую строку ... потому что если это сработает, это будет проще, чем отказаться от сеанса. –

Смежные вопросы