Zusammenführen von Datei-Chunks in PHP

Für die pädagogischen Zwecke wollte ich Datei-Chunks hochladen. Woher wisst ihr, wann alle Chunks hochgeladen wurden?

Ich habe versucht, Chunks von @ zu verschiebetemp und benennen sie um, damit sie in der richtigen Reihenfolge sind, und führen sie dann mit dem letzten Block zusammen. Allerdings ist das zuletzt gesendete Stück nicht das zuletzt erhaltene, denke ich. Sofopen() on-Chunks schlagen fehl, da sie noch nicht erstellt wurden, und ich erhalte die endgültige Datei mit der Größe, die genau der Größe des letzten Chunks entspricht.

Ich glaube, ich könnte Stücke eins nach dem anderen mit @ send.onload event onxhr, auf diese Weise müsste ich sie nicht einmal aus PHP-Temp verschieben, aber ich frage mich, ob es verschiedene Lösungen gibt.

Einigen Basiscode, der Ihnen gefällt:

function upload(file) {
  var BYTES_PER_CHUNK = parseInt(2097152, 10),
  size = file.size,
  NUM_CHUNKS = Math.max(Math.ceil(SIZE / BYTES_PER_CHUNK), 1),
  start = 0, end = BYTES_PER_CHUNK, num = 1;

  var chunkUpload = function(blob) {
    var fd = new FormData();
    var xhr = new XMLHttpRequest();

    fd.append('upload', blob, file.name);
    fd.append('num', num);
    fd.append('num_chunks', NUM_CHUNKS);
    xhr.open('POST', '/somedir/upload.php', true);
    xhr.send(fd);
  }

  while (start < size) {
    chunkUpload(file.slice(start, end));
    start = end;
    end = start + BYTES_PER_CHUNK;
    num++;
  }
}

Und PHP:

$target_path = ROOT.'/upload/';

$tmp_name = $_FILES['upload']['tmp_name'];
$filename = $_FILES['upload']['name'];
$target_file = $target_path.$filename;
$num = $_POST['num'];
$num_chunks = $_POST['num_chunks'];

move_uploaded_file($tmp_name, $target_file.$num);

if ($num === $num_chunks) {
  for ($i = 1; $i <= $num_chunks; $i++) {

    $file = fopen($target_file.$i, 'rb');
    $buff = fread($file, 2097152);
    fclose($file);

    $final = fopen($target_file, 'ab');
    $write = fwrite($final, $buff);
    fclose($final);

    unlink($target_file.$i);
  }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage