2016-07-07 14 views
0

я отправить несколько изображений в сценарий Perl с помощью запроса AJAXПолучить сообщение для всех загруженных изображений вместо для каждого из

$("form#multiupload").submit(function(){ 

    var formData = new FormData($(this)[0]); 

    $.ajax({ 
     url: "/cgi-bin/upload_my_images.pl", 
     type:  'POST', 
     async:  false, 
     cache:  false, 
     contentType: false, 
     processData: false, 
     data:  formData, 
     success:  function (data) { 
      alert(data) 
     } 
    }); 

    return false; 
}); 

Я загрузки изображений на сервер с Perl

my @fh = $cgi->param("img"); 

foreach my $fh (@fh) { 

    my $uploaddir = 'somedir'; 
    my $serverFile = $uploaddir . "/" . (split(/[\\\/]/, $filename))[-1]; 
    my $buffer; 

    open(FILE, ">$serverFile") or die $!; 
    binmode FILE; 
    binmode $fh; 

    while (my $bytesread = read($fh, $buffer, 1024)) { 
     print FILE $buffer; 
    } 

    close(FILE); 
} 

Когда загрузка будет успешной, я получаю предупреждающее сообщение.

Можно ли получить сообщение, когда все изображения загружены успешно, или я должен загрузить каждое отдельное изображение с помощью своего собственного запроса AJAX?

+0

Что такое действие в браузере, чтобы начать это? Как выбрать изображения для загрузки? – Borodin

ответ

1

Во-первых (и, самое главное) избавиться от async: false. Это ужасная практика использовать его, поскольку он блокирует поток пользовательского интерфейса. Если вы проверите консоль, вы увидите предупреждение браузера о том, что вы ее не используете.

Во-вторых, если вы хотите, чтобы отдельные сообщения о каждом загружаемом файле были отправлены, вам необходимо отправить их отдельно, поскольку событие progress работает только для запроса в целом.

Вы можете сделать это по-старому и отправить один запрос на загрузку, а затем отправить другие запросы каждые ~ 1сек для контроля за его прогрессом и проверить, какие загрузки файлов завершены, но это добавит дополнительную нагрузку ваш сервер и, честно говоря, уродливый ложе.

+0

* «Это ужасная практика использовать его, поскольку он блокирует поток пользовательского интерфейса». * Я думаю, что * ужасный * сильно завышает его. (Не будет * плохой? Прекрасно?) Это портит большую часть точки AJAX, но это не хуже кода не AJAX, и по крайней мере экран клиента по-прежнему не обновляется. – Borodin

+0

Личное мнение действительно, но я считаю, что это хуже чем не-AJAX-код. Весь смысл AJAX в том, что он асинхронный. Выполняя его синхронно, точка запроса полностью избыточна, а также делает браузер выглядеть так, как будто он висел, пока запрос ожидает ответа. Вот почему «async: false» устарел и почему браузеры предупреждают о консолях при его использовании. Это просто плохая практика в подавляющем большинстве случаев. Если вы собираетесь делать AJAX, сделайте это правильно и используйте обратные вызовы. –

+0

Я не согласен, кроме того, что он * не может * быть хуже, чем не-AJAX-код, который также * «делает браузер похожим на то, что он повесил» *. Я бы не хотел этого в производственном коде, хотя – Borodin

0

Я решил проблему так:

  1. Я создать идентификатор сессии и отправить форму на сервер с помощью AJAX.
  2. Скриншот perl загружает каждое изображение и выполняет некоторый процесс с ним. Впоследствии сценарий записывает в файл журнала (по имени sesseion id) статус процесса. После последнего цикла в журнал записывается флаг завершения.
  3. С клиентской стороны я проверяю с помощью jquery .get() каждые 2 секунды содержимое файла журнала и записываю его в DOM. Если установлен флаг завершения, процесс будет отменен, и на сервер будет отправлен сигнал для удаления файла журнала.

Возможно, не самый лучший способ, но он работает отлично ...