Файл фрагментов Javascript на куски и отправка проанализированных данных в MySQL через переполнение стека

Я пытался обрабатывать файлы с помощью ajax, chunk-файлов и отправлять проанализированную информацию в mysql через php. Вот пример файла:

test;test;test
test1;test2;test3

и т.п.
Но php зависает, если я отправляю большие файлы (время ожидания более 40 секунд с файлами 600 КБ)
PHP:

<?php
$file = @$GLOBALS['HTTP_RAW_POST_DATA'];
if(empty($file)){
$file = file_get_contents('php://input');
}
if(!empty($file)){
function parser($file){
// parser
}
parser($file);
foreach($parsed_results as $key => $val){
mysql_query("INSERT INTO ...");
}
}
?>

Javascript:

<script>
function addDNDListener(obj){
obj.addEventListener('dragover',function(e){
e.preventDefault();
e.stopPropagation();
},false);
obj.addEventListener('dragenter',function(e){
e.preventDefault();
e.stopPropagation();
},false);
obj.addEventListener('drop',function(e){
e.preventDefault();
e.stopPropagation();
var filelist = e.dataTransfer.files;
for(var i=0;i<filelist.length;i++){
var file = filelist[i];
uploadFile(file);
}
},false);
}

function uploadFile(file){
var loaded = 0;
var step = 1024 * 1024;
var total = file.size;
var start = 0;
var progress = $(".progress-bar");

var reader = new FileReader();reader.onload = function(e){
$("#container h3").hide();
$(".progress").fadeIn();
var xhr = new XMLHttpRequest();
var upload = xhr.upload;
upload.addEventListener('load',function(){
loaded += step;
progress.width((loaded/total) * 100);
if(loaded <= total){
blob = file.slice(loaded,loaded+step);
reader.readAsBinaryString(blob);
} else {
loaded = total;
}
}, false);
xhr.open("POST", "/add.php";
xhr.overrideMimeType("application/octet-stream");
xhr.sendAsBinary(e.target.result);
};
var blob = file.slice(start,step);
reader.readAsBinaryString(blob);
}

window.onload = function(){

addDNDListener(document.getElementById('container'));
if(!XMLHttpRequest.prototype.sendAsBinary){
XMLHttpRequest.prototype.sendAsBinary = function(datastr) {
function byteValue(x) {
return x.charCodeAt(0) & 0xff;
}
var ords = Array.prototype.map.call(datastr, byteValue);
var ui8a = new Uint8Array(ords);
try{
this.send(ui8a);
}catch(e){
this.send(ui8a.buffer);
}
};
}
};
</script>

HTML:

<div id="container">
<h3>Drag and Drop file here</h3>
<div style="display:none" class="progress">
<div class="progress-bar"></div>
</div>
</div>

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector