Ajax / iFrame / FileSystemObject Upload - PullRequest
       2

Ajax / iFrame / FileSystemObject Upload

2 голосов
/ 22 января 2012

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

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

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

Я запустил страницу 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

1 Ответ

1 голос
/ 22 января 2012

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

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

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

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

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

РЕДАКТИРОВАТЬ: На самом деле я беруназад часть о куки.Конечно, вы можете убить их, дав headers:{Cookie:""} на ваш ajax() звонок?Стоит попробовать ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...