2016-07-07 15 views
0

ich ein paar Bilder zu einem Perl-Skript über eine AJAX Anfrage sendenGet Nachricht für alle statt hochgeladenen Bilder für jedes

$("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; 
}); 

ich die Bilder mit Perl auf dem Server bin Hochladen

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); 
} 

Wenn der Upload erfolgreich ist, erhalte ich die Warnmeldung.

Ist es möglich, eine Nachricht zu erhalten, wenn alle Bilder erfolgreich hochgeladen wurden, oder muss ich jedes einzelne Bild mit einer eigenen AJAX-Anfrage hochladen?

+0

Was ist die Aktion auf dem Browser diese zu initiieren? Wie würden Sie die Bilder auswählen, die hochgeladen werden sollen? – Borodin

Antwort

1

Zuerst (und am wichtigsten) loswerden async: false. Es ist entsetzlich, es zu benutzen, da es den UI-Thread blockiert. Wenn Sie das Ereignis "Konsole" überprüfen, wird der Browser gewarnt, dass Sie ihn nicht verwenden sollen.

Zweitens, wenn Sie einzelne Nachrichten über jede Datei hochladen möchten, müssen Sie sie separat senden, da das progress Ereignis nur für die Anfrage als Ganzes funktioniert.

Sie könnten es auf die altmodische Art und Weise tun und senden Sie eine einzige Anfrage, um den Upload zu tun, und senden Sie dann alle ~ 1sec alle Anfragen, um seinen Fortschritt zu überwachen und zu überprüfen, welche Dateiuploads abgeschlossen wurden, aber dies würde zusätzliche Belastung Ihr Server und ist, offen gesagt, ein hässlicher Brei.

+0

* "Es ist horrend, es zu benutzen, da es den UI-Thread blockiert" * Ich denke * horrend * übertreibt es enorm. (Würde nicht * schlecht * geht es gut?) Es verwöhnt ziemlich viel von AJAX, aber es ist nicht schlechter als Nicht-AJAX-Code und zumindest der Client-Bildschirm ist immer noch nicht aktualisiert – Borodin

+0

Persönliche Meinung wirklich, aber ich glaube, es ist schlimmer als Nicht-AJAX-Code. Der ganze Sinn von AJAX ist, dass es asynchron ist. Wenn es synchron ausgeführt wird, wird der Punkt der Anfrage vollständig überflüssig und der Browser sieht aus, als ob er hängen geblieben wäre, während die Anfrage auf eine Antwort wartet. Aus diesem Grund wird async: false abgelehnt, und Browser zeigen Warnungen in der Konsole an, wenn Sie sie verwenden. In den allermeisten Fällen ist es einfach nur schlecht. Wenn Sie AJAX machen, tun Sie es richtig und verwenden Sie Rückrufe. –

+0

Ich stimme nicht zu, außer dass es * nicht * schlechter sein kann als Nicht-AJAX-Code, der auch * "den Browser so aussehen lässt, als ob er hängen geblieben wäre *". Ich würde das im Produktionscode allerdings nicht wollen – Borodin

0

Ich löste das Problem auf diese Weise:

  1. ich eine Session-ID erstellen und das Formular über Ajax an den Server senden.
  2. Das Perl-Skript hochladen Sie jedes einzelne Bild und einige Prozesse mit it. Anschließend schreibt das Skript den Status des Prozesses in eine Logdatei (benannt durch die session-ID). Nach der letzten Schleife wird ein Abschlussflag in das Protokoll geschrieben.
  3. Auf der Client-Seite, überprüfe ich mit jquery .get() alle 2 Sekunden den Inhalt der Logdatei und schreibe sie in DOM. Wenn das Ende-Flag gesetzt ist, wird der Prozess abgebrochen und ein Signal wird an den Server gesendet, um die Logdatei zu löschen.

Vielleicht nicht der beste Weg, aber es funktioniert gut ...

Verwandte Themen