Fusionar fragmentos de archivos en PHP

Para fines educativos, quería crear la carga de fragmentos de archivos. ¿Cómo saben cuándo se cargan todos los fragmentos?

Traté de mover trozos detemp y renombrándolos para que estén en el orden correcto, y luego, con el último fragmento, fusionarlos. Sin embargo, la última pieza enviada no es la última pieza recibida, supongo. Entoncesfopen() en fragmentos falla ya que aún no se han creado, y obtengo el archivo final con el tamaño exactamente del tamaño del último fragmento.

Creo que podría enviar trozos uno por uno usando.onload evento enxhr, de esa manera, ni siquiera tendría que moverlos desde PHP temp, pero me pregunto si hay diferentes soluciones.

Algún código básico para complacerte:

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

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta