Hallo Rolf,
ja, wie gesagt: Du musst auf das Ende des send warten. D.h. du musst Dich beim XMLHttpRequest Objekt (nehmen wir mal an, es steht in der Variablen xhr) auf readystatechange registrieren und bei
xhr.readyState === XMLHttpRequest.DONE
undxhr.status === 200
ist der Upload des Chunks fertig.
empfiehlst du den typsicheren Vergleich hier aus einem konkreten Grund? Hast du in dem Zusammenhabg schon mal einen Brechreiz bei Huftieren erlebt?
Davon unabhängig: Auch ein Status, der von 200 (OK) abweicht, verdient besondere Beachtung - besonders, aber nicht nur beim ersten Chunk. Rennt man mit dem ersten Chunk in einen Fehler (4xx oder 5xx), kann man eigentlich gleich den ganzen Upload-Vorgang abpfeifen. Tritt zwischendurch ein Fehler auf, muss man im Einzelfall entscheiden, ob es sich lohnt, den Chunk zu wiederholen, oder ob man besser abbrechen sollte.
Da Du die Slices wohl nur deshalb bildest, um dem Server keine zu großen Brocken auf einmal anzuliefern, solltest Du immer erst dann einen neuen Send starten, wenn der alte durch ist. Eine Parallelisierung der Requests bringt eigentlich nichts, denn der limitierende Faktor für das Upload-Tempo dürfte die Bandbreite des Clients sein und das verbesserst Du nicht, indem Du die Bandbreite auf zwei Transfers aufteilst.
Guter Punkt.
Bei einer Parallelisierung, d.h. zwei oder mehr Requests gleichzeitig, kommt erschwerend hinzu, dass Dir niemand die Reihenfolge garantiert, in der der Server zwei gleichzeitig vorliegende Requests abarbeitet. Da Du sie nacheinander schickst, ist die Wahrscheinlichkeit extrem hoch, dass sie in dieser Reihenfolge ankommen und auch in dieser Reihenfolge verarbeitet werden. Es ist jedoch nicht garantiert.
Genua. TCP/IP hat kein deterministisches Zeitverhalten. Das bedeutet aber auch, dass das PHP-Script, das sie Chunks entgegennimmt, für jeden einzelnen Request wissen muss, welchem Datei-Offset das entspricht. Und es muss (entweder beim ersten, besser noch bei jedem Chunk) eine Angabe der Gesamt-Dateigröße bekommen, damit es zu gegebener Zeit feststellen kann: Jetzt hab ich alles und kann die fertige Datei wegspeichern.
Mit etwas Programmiergeschick kannst Du aber in der Zeit, wo Du auf die Fertigstellung des vorigen POSTs wartest, den nächsten Slice vorbereiten.
Das wäre cool, ja.
Einen schönen Tag noch
Martin
Es liegt allein an uns, ob wir aus den vielen Steinen, die wir einander in den Weg legen, Mauern oder Brücken bauen. (Ernst Ferstl)