Ich brauche Beratung auf meinem Ajax Fortschrittsbalken während der Ausführung eines langen PHP-Skriptes Bilder behandeln. Ich weiß, dass es bereits viele Fragen auf Stackoverflow sind wiejquery ajax Fortschritt mit benutzerdefinierten Berechnung
- Show progress for long running PHP script
- oder JQuery ajax progress via xhr
- oder update progress bar using ajax request seconds)
Die meisten Beispiele Ich sehe die Dateigröße verwenden die zur Berechnung Fortschritt. Aber in meinem Fall möchte ich Prozent basierend auf images_treated/total_images
berechnen.
So kann ich immer noch nicht so arbeiten, wie ich will.
In JS unten habe ich die nicht funktionierende Fortschrittsfunktion kommentiert, die ich von einer anderen Frage und dataType: 'json'
für Tests genommen habe, aber ich würde bevorzugen, wenn ich noch eine JSON Rückkehr verwenden kann.
Fragen
- Die console.log() wird nur einmal anmelden - wenn das vollständige Skript ausgeführt wird. Mache ich es falsch?
- Was soll ich schreiben, um den Kommentar zu ersetzen?
- In einigen Antworten sind die PHP-Header auf Header gesetzt ('Content-Type: application/octet-stream'); ist es obligatorisch oder einfach schöner?
Javascript:
$.ajax(
{
type: 'GET',
// dataType: 'json',
url: formAction,
data: 'addImagesToArticle',
cache: false,
xhr: function()
{
var xhr = new window.XMLHttpRequest();
// Download progress.
xhr.addEventListener("progress", function(e)
{
console.log(e);
// I saw this piece of code from another question it is supposed to work... Maybe my PHP?
/*var lines = e.currentTarget.response.split("\n");
var progress = lines.length ? lines[lines.length-1] : 0;
$('#progress').text(progress);*/
}, false);
return xhr;
}
});
Mein PHP ist ziemlich groß, so einfach schnell ich erklären: in der Schleife auf Bilder, die ich Variablen $images_treated
und $total_images
. Nach der Schleife wird eine Zusammenfassung über JSON in einem Objekt wie {error: bool, message: string, ...}
an JS zurückgegeben, wenn es einen Weg gibt, den Fortschritt ohne Echo zu machen, aber eine JSON-Variable zu setzen, die perfekt wäre!
Vielen Dank für Ihre Hilfe!
[EDIT] um Kontextdetails hinzuzufügen.
Ich möchte dies in einer Admin-Seite verwenden, in einer Artikelausgabe mit einem WYSIWYG, ich habe Dropzone kümmert sich um meine mehrere Bilder Uploads.
dann sehe ich die Vorschau der Bilder, während jedes Bild in Temp-Ordner auf dem Server abgelegt wird. Ich kann dann einige Bilder entfernen, wenn nötig und sobald alle Bilder endgültig sind, klicke ich auf eine Schaltfläche, die sie für die Größenänderung von 2 Größen verarbeiten und Figur-Tags mit img in den Artikel WYSIWYG Editor injizieren.
Eine AJAX-Anfrage und die Arbeit, die auf dem Server erledigt wird, um diese Anfrage zu bedienen, ist eine behandelte Einzeleinheit. Das bedeutet, dass Sie nicht wissen können, welche Arbeit der Server gerade leistet, nur durch das Ereignis "Fortschritt", nur wie viele Daten gesendet/empfangen wurden. Wenn Sie den Fortschritt in den vom Server ausgeführten Schritten kennen möchten, müssen Sie den Server so codieren, dass er die zuletzt erledigte Aufgabe auf einem Endpunkt speichert, der von einer zweiten AJAX-Anforderung aus erreichbar ist, die Sie dann in Intervallen während der Hauptanforderung aufrufen läuft. –
Ja, wenn ich dich verstehe, brauche ich einen zweiten php, um den Fortschritt zu senden, damit der Fortschritt in der Sitzung gespeichert werden kann, wenn es nötig ist. Aber wie frage ich dann beide PHP-Skripte aus einer AJAX in JS-Datei? – antoni
Ich denke, dass das, was Sie zu erreichen versuchen, etwas anders ist als Ihr Ansatz. Hier finden Sie eine [Frage] (http://stackoverflow.com/a/18964123/6565883) zu diesem Thema. Sie können von der Serverseite aus den Status der Verarbeitung drucken. Ich hoffe es hilft. – Riccardo