В настоящее время я разрабатываю модуль загрузки для очень больших файлов (больше, чем сервер когда-либо позволит) с прогрессом и всем этим. См. Ниже код. Он работает для текстовых файлов, изображений, даже документов doc и pdf. Он сбой для любого другого типа файла. У кого-нибудь есть предложения?
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("<p>Upload started for file " + file.name + "</p>"); } 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("<p>File " + file.name + " uploaded succesfully. Download file <a target='_blank' href='uploads/" + file.name + "'>here</a></p>"); } }); }; fr.readAsDataURL(file.slice(start, end)); } SendSlice();
И 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);
Кроме того, я попытался использовать readAsBinaryString, но я не знаю, как обрабатывать результат в PHP. Пожалуйста посоветуй
Это просто выстрел в темноте, но, глядя на API file.slice ( http://www.w3.org/TR/FileAPI/#dfn-slice ), он говорит:
«Метод slice возвращает новый объект Blob с байтами в диапазоне от необязательного параметра запуска до, но не включая необязательный конечный параметр, и с атрибутом типа, который является значением дополнительного параметра contentType».
Тем не менее, вы вычитаете 1 из «конца» перед его использованием – означает ли это, что вы не оставляете 1 байт на каждом фрагменте (так как конечный байт в любом случае не включен)?
(Кроме того, вы дезинфицируете $ _POST ['filename'], прежде чем использовать его – не то, что кто-то ставит «../yourscript.php» там .. правильно?;))