Uploads de arquivos grandes usando o FileReader e o php

Atualmente, estou desenvolvendo um módulo de upload para arquivos muito grandes (maior do que o servidor permitirá) com progresso e tudo isso. Veja o código abaixo. Ele funciona para arquivos de texto, imagens, até documentos e arquivos pdf. Ele trava para qualquer outro tipo de arquivo. Alguém tem alguma sugestão?

var fr = new FileReader; chunkSize = 524288; //chunkSize = window.maxPost; var chunks = Math.ceil(file.size / chunkSize); var chunk = 0; function SendSlice() { var start, end; start = chunk * chunkSize; if (start > file.size) { start = end + 1; } end = start + (chunkSize - 1) >= file.size ? file.size : start + (chunkSize - 1); status = chunk == 0 ? "start" : (chunk == chunks ? "end" : "progress"); if (status == 'start') { $("#upload-area").append("

Upload started for file " + file.name + "

"); } fr.onload = function(e) { var sliceData = e.target.result; $.ajax({ type : "POST", url : "uploader.php", data : { filename : file.name, status : status, slice : sliceData } }).success(function(data) { if (++chunk <= chunks) { SendSlice(); var progress = (chunk / chunks) * 100; $("#progress-text").html(progress.toFixed(2) + "%"); $("#progress").css({ width : progress + "%" }); } else { $("#upload-area").append("

File " + file.name + " uploaded succesfully. Download file here

"); } }); }; fr.readAsDataURL(file.slice(start, end)); } SendSlice();

E o código php:

  if($_POST['status'] == 'start') { if (file_exists("uploads/" . $_POST['filename'])) { unlink("uploads/" . $_POST['filename']); } } $data = explode(",", $_POST['slice']); $data = $data[1]; $data = base64_decode($data); file_put_contents("uploads/" . $_POST['filename'], $data, FILE_APPEND); 

Além disso, tentei usar readAsBinaryString, mas não tenho idéia de como o problema é o resultado em PHP. Conselho por favor

Isso é apenas um tiro no escuro, mas olhando para o arquivo.slice API ( http://www.w3.org/TR/FileAPI/#dfn-slice ), diz:

“O método de fatia retorna um novo object Blob com bytes variando do parâmetro de boot opcional até, mas não incluindo o parâmetro final opcional e com um atributo de tipo que é o valor do parâmetro optionalTipTypeType”.

No entanto, você subtrai 1 de “fim” antes de usá-lo – isso significa que você deixa de fora 1 byte em cada pedaço (já que o byte final não está incluído de qualquer maneira)?

(Além disso, você sanitizar $ _POST [‘nome do arquivo’] antes de usá-lo – não que alguém coloque “../yourscript.php” lá … certo?;))