как получить статус загрузки файла в посте ajax

Как получить статус загруженных файлов, когда пользователь нажимает кнопку отмены при загрузке нескольких файлов с помощью вызова ajax.

Таким образом, я вызываю запрос ajax для загрузки файлов:

 var request = $.ajax({
     url: 'files.php',
     type: 'POST',
     data: data,
     cache: false,
     contentType: false,
     processData: false,
     beforeSend: function () {
         $(".progressbar").show();
     },
     xhr: function () {
         var xhr = $.ajaxSettings.xhr();
         if (xhr.upload) {
             xhr.upload.addEventListener('progress', showProgress, false);
         }
         return xhr;
     },
     success: function (data) {
         if (percentComplete <= 100) {
             $('#pb div').animate({
                 width: '100%'
             }, {
                 step: function (now) {
                     $(this).text(Math.round(now) + '%');
                 },
                 duration: 10
             });
         }
         $('#uplcomp').append(data);
     }
 });

Если пользователь нажимает кнопку отмены, я делаю это:

request.abort();

Поскольку приведенное выше утверждение просто прерывает запрос ajax, я не получаю никакого ответа, например, сколько файлов загружено, сколько загружено mb и т. д....

Может ли кто-нибудь помочь мне в этом?


person fedrick    schedule 19.06.2014    source источник


Ответы (1)


Я не думаю, что для вашего вопроса есть способ по умолчанию. Информация, которую вы ищете — количество загруженных файлов — не хранится в XMLHttpRequest. объект моими знаниями.

Я полагаю (но никогда не пробовал), что вы можете создать для него что-то нестандартное. Анализ высокого уровня: отслеживайте процесс загрузки на стороне сервера. Храните некоторую информацию в своей базе данных относительно загрузки: количество файлов для обработки, количество обработанных файлов, дату/время, уникальный идентификатор загрузки/сеанса. Когда вы прерываете загрузку или она не удалась, вы можете получить информацию о процессе загрузки на основе уникального идентификатора через ajax из своей БД и представить ее в пользовательском интерфейсе.

Примечание. Если запрос уже отправлен на сервер, сервер обработает запрос, даже если мы прервем запрос, но клиент не будет ждать/обрабатывать ответ.

Надеюсь это поможет.

person Dimitri Zetzsche    schedule 20.06.2014
comment
возможно ли здесь без использования db... по крайней мере, можно ли показать текущий загружаемый файл с помощью xhr? - person fedrick; 20.06.2014
comment
+1 за разъяснение, что загруженные файлы хранятся в XMLHttpRequest - person fedrick; 20.06.2014
comment
Я не вижу подходящего решения без использования БД. Информацию нужно где-то хранить, чтобы вы могли получить ее позже. Чтобы показать текущий загружаемый файл: я думаю, что самый простой способ сделать это - выполнить отдельный запрос ajax для каждого файла, который необходимо загрузить. Таким образом, вы знаете в клиенте, с каким файлом вы (не) работаете. Таким образом, вы можете легко представить информацию об обработке в пользовательском интерфейсе. Рассмотрите возможность использования существующего сценария загрузки, который сделает эту работу за вас. Я часто использую Dropzone.js, который показывает много информации о загрузке. - person Dimitri Zetzsche; 20.06.2014
comment
я не хочу использовать какие-либо сторонние скрипты, которые мне не нравятся... и из-за проблем с безопасностью я делаю один запрос ajax. Так как в моем коде есть мелкие ошибки. Итак, можем ли мы сделать это в одном запросе ajax? если это возможно, как я могу показать текущее имя загружаемого файла - person fedrick; 20.06.2014
comment
Я не вижу, чтобы он работал в одном запросе и отображал информацию о загружаемом в данный момент файле. Вы должны отправлять их по одному, чтобы показать информацию, а не отправлять все файлы сразу. Безопасная работа здесь не по теме. Вы должны использовать HTTPS для шифрования ваших данных. Если один единственный вызов небезопасен, то и несколько вызовов также будут небезопасны. В конце концов это одно и то же: пользователи отправят 1 запрос с несколькими файлами или сделают несколько запросов с 1 файлом. Дело не в безопасности работы, а в производительности на стороне клиента. Хотя это не проблема, большинство клиентских машин в наши дни являются высококлассными устройствами. - person Dimitri Zetzsche; 20.06.2014
comment
а также забыл упомянуть, что я использую один вызов ajax, потому что я хочу показать один индикатор выполнения для всех файлов, т.е. если мы загружаем 3 файла за раз, нужно показать один индикатор выполнения, который вычисляет процентную сумму всех файлов и отображает на экран - person fedrick; 20.06.2014
comment
Тем не менее, это не проблема. Вам нужно реорганизовать свой алгоритм, чтобы он учитывал несколько загрузок, а не один запрос. Ваш главный вопрос касался визуализации времени, необходимого для выполнения вашего запроса. Не прогресс, сколько файлов обрабатывается. Это две разные вещи. Вам нужно уточнить для себя, какие аспекты вы хотите измерить: затраченное время или обработанные суммы. Исходя из этого, вам необходимо провести рефакторинг вашего кода. Опять же, для экономии времени и усилий используйте сторонние сценарии, которые доказали свое существование. Используйте их в качестве основы для своей работы и перерабатывайте их, если это необходимо. - person Dimitri Zetzsche; 20.06.2014
comment
я хочу завершить это обсуждение ... так что невозможно показать имя загружаемого файла в одном запросе ajax, а также невозможно получить статус загрузки в запросе ajax после прерывания, здесь нам нужно использовать db ryt? и хочу знать, вызываю ли я отдельный запрос ajax для каждого файла, как я могу проверить общий размер всех файлов, который не должен превышать лимит? - person fedrick; 20.06.2014
comment
Я не думаю, что это возможно, да. Действительно, БД с информацией о процессе должна давать больше информации. Пожалуйста, имейте в виду мое примечание к моему ответу: скрипт на сервере все равно продолжит обработку (= загрузку), потому что его инициировал ajax-запрос. Прерывание ajax не останавливает ваш серверный скрипт. Еще одна причина отправлять их по одному. Вы можете определить размер файла с помощью JS. Если вы можете сделать это за 1 вы можете сделать это для всех файлов. Таким образом, вы можете выполнять бизнес-логику с этим результатом. Удачи. - person Dimitri Zetzsche; 20.06.2014
comment
Давайте продолжим обсуждение в чате. - person fedrick; 20.06.2014
comment
Я не могу, я нахожусь в безопасной среде, и веб-страница чата заблокирована. Дайте ему войти в свой код вместе с некоторой работой Google, и он будет работать нормально. - person Dimitri Zetzsche; 20.06.2014
comment
Мы не можем доверять значениям, поступающим от js, поскольку вы знаете, что js — это код, который пользователи могут просматривать. Как я могу проверить на сервере для загрузки файлов - person fedrick; 20.06.2014
comment
Ржу не могу. Если вы не доверяете JS, не используйте его вообще... Вы можете проверить его с помощью языка сценариев на стороне сервера, в вашем случае: PHP. Попробуйте. - person Dimitri Zetzsche; 20.06.2014
comment
видеть, что все функции перетаскивания будут выполняться в коде js, а не в php... я уже не выполнял проверку на стороне клиента в js... и не проверял то же самое на стороне сервера.. если я делаю отдельные запросы ajax, это невозможно для проверки на стороне сервера - person fedrick; 20.06.2014
comment
Если вы используете функцию перетаскивания (например, dropzone), вы, вероятно, можете установить ограничение на размер файла. Если вы не доверяете проверке. Не используйте его: сделайте форму с несколькими загрузками файлов и выполните классическое POSTдействие. Подтвердите свою сторону сервера данных и предоставьте ответ true/false в PHP. Если вы хотите использовать его, либо согласитесь с JS, либо выполните дополнительную проверку отправляемых данных на стороне сервера. Вы все еще можете определить в PHP, собираетесь ли вы хранить файл. Мы собираемся темы здесь по этому вопросу. Попробуйте и вернитесь с конкретной проблемой. в другом вопросе. - person Dimitri Zetzsche; 20.06.2014