• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

XMLHttpRequest Error

bosko

Member
Hallo,

mein Problem liegt an einer Verarbeitung mit OB_Flash() im PHP Code was per XMLHttpRequest abgerufen wird.
Kurz erklärt was mein Script machen soll.
Im Hintergrund wird eine ZIP Datei Entpackt und per XMLHttpRequest in eine DIV die Ausgabe sowie der Prozessbalken.
Das Script Stop immer an unterschiedlichen Stellen und gibt mir folgendes aus:

SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data

mein JavaCode sieht wie folgt aus:
HTML:
function unzip_stream() {  
            document.getElementById("show_unzip_act").style.display = "block";  
            document.getElementById("show_unzip_link").style.display = "none";  
            document.getElementById("show_unzip_warn").style.display = "none";  
            if (!window.XMLHttpRequest){      
                alert("Your browser does not support the native XMLHttpRequest object.");      
                return;      
            }      
            try{  
                var xhr = new XMLHttpRequest();
				xhr.overrideMimeType("application/json");

                xhr.previous_text = '';      
                                       
                xhr.onerror = function() { alert("[XHR] Fatal Error."); };      
                xhr.onreadystatechange = function() {      
     
                        if (xhr.readyState == 4){  
                            document.getElementById("progress_wrapper").style.display = "none";  
                            document.getElementById("show_unzip_txt").style.display = "none";  
                            document.getElementById("show_unzip_exit").innerHTML = 'Datei wurde erfolgreich Entpackt!';      
                        }       
                        else if (xhr.readyState > 2){      
                            var new_response = xhr.responseText.substring(xhr.previous_text.length);      
                            var result = JSON.parse(new_response);  
 
                            document.getElementById("divProgress").innerHTML += result.message + '<br />';      
                            document.getElementById('progressor').style.width = result.progress + "%";      
                            scrollToBottomOfDiv("divProgress");      
                            xhr.previous_text = xhr.responseText; 
                        }        
                          
                         
                };      
                xhr.open("GET", "unzip.php", true);      
                xhr.send();            
            }      
            catch (e){      
                alert("[XHR REQUEST] Exception: " + e);      
            }      
        }      
        function scrollToBottomOfDiv(divName) {      
            mydiv = document.getElementById(divName);      
            mydiv.scrollTop = mydiv.scrollHeight;      
        }

Dies soll der Fehler sein:

unzip_stream/xhr.onreadystatechange -> var result = JSON.parse(new_response);

wenn ich kleine Zip's entpacken möchte läuft es ohne Probleme, soweit ich z.B. an eine
5MB datei rangehe kommt der Fehler, wiegesagt immer an unterschichtlichen % stellen.
Im seltesten Fall, läuft er mal durch.

Wie kann ich dies beheben?

Gruß
 
Ich schieße mal ins Blaue, dass da mit .substring() was nicht stimmt.
Wie genau sehen denn xhr.responseText und new_response aus, wenn der Fehler kommt?
 
bei einem readyState != 4 ist deine response noch nicht vollständig vorhanden, da fehlt also was am ende von deinem JSON-string.
bei einem 2. aufruf von readystatechange mit readyState == 3 oder dem aufruf von readystatechange mit readyState == 4 nach vorherigem aufruf mit readyState == 3 fehlt der anfang, da du den substring ab dem vorherigen aufruf mit readyState == 3 bildest.

bei deinem JSON-string kann also am ende und/oder am anfang etwas fehlen
 
@ mikdoe
also eigentlich nichts ungewöhnlliches hier mal die Log der letzten Zeile:
Code:
{"message":"Erstelle: phpMyAdmin-4.8.4-english\/vendor\/phpmyadmin\/sql-parser\/locale\/ug\/LC_MESSAGES\/","progress":12.377279102384} unzip.html:119:15
SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data at line 1 column 135 of the JSON data

Oder:
Code:
{"message":"Erstelle: phpMyAdmin-4.8.4-english\/templates\/components\/","progress":3.2608695652174} unzip.html:119:15
SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data at line 1 column 97 of the JSON data

das ganze Startet mit der ersten Zeile die so aussieht:
Code:
{"message":"Bitte Warten, Datei wird vorbereitet!","progress":0}

@ tsseh
Da ich kein Stat == 3 habe, ist die frage, ob ich eine einbauen sollte? und wie du oben sehen
kannst, erste und letzte Zeile, weiß ich nicht was fehlen sollte.
 
das liegt am unzip.html:119:15

Da ich kein Stat == 3 habe, ist die frage, ob ich eine einbauen sollte?
xhr.readyState > 2 und nicht xhr.readyState == 4 ist das gleiche wie xhr.readyState == 3

und wie du oben sehen
kannst, erste und letzte Zeile, weiß ich nicht was fehlen sollte.
das sind aber nur ein paar bytes, bei denen du mit einer MTU von 1500 immer glück hast.
mach das mal mit deiner 5mb datei
 
bei den Zeilen ist es nur ein auszug, ist die Datei phpmyadmin.zip und diese ist ca 7 MB groß,
enthält ca um die 2700 datei die durch die schleife laufen, einmal ist er ganz urchgelaufen aber
bei wiederholten mal stop das script an unterschiedlichen stellen, werde nochmal testen mit einem
Zähler um zu sehen an welcher stelle er ca stop

- - - Aktualisiert - - -

so hab getestet, es stop an unterschiedlichen Stellen, mal 552, mal 252 und dann 177
 
Hast du es mal mit jQuery's .get() oder .ajax() versucht, um Fehler im Serverscript auszuschließen?
 
Ganz einfaches Ajax sollte gehen. Oder was meinst du mit "xtr"?

HTML:
jQuery.ajax({
	url: 'unzip.php',
	data: ...,	// deine POST-Parameter falls nötig
	dataType: 'json',
	type: 'POST',
	cache: false,
	success: function(input) {
		console.log('Erhalte: '+input);
	},
	error: function(jqXHR,textStatus,errorThrown) {
		alert('Dezentraler Fehler:<br>textStatus: '+textStatus+'<br>errorThrown: '+errorThrown;
	}
});
 
der fehler kommt, weil da noch " unzip.html:119:15" steht, sieh dir mal im debuger die antwort des requests an
 
der fehler kommt, weil da noch " unzip.html:119:15" steht
Wo kommt das her?

sieh dir mal im debuger die antwort des requests an
Heißt Response und wo sehe ich die?

Meinst du den SyntaxError aus #4?
Der hat nichts mit JS und JSON zu tun. Das passiert, wenn der Ausgabe-Zeichensatz nicht demjenigen entspricht in dem die Ausgabe angelegt ist. Passiert gern und oft bei Verwirrungen mit latin1/iso-8859-1x versus utf8.
Was ist denn deine Ausgabe genau? Worum handelt es sich dabei?
 
Wo kommt das her?
fragst du mich das? k.a.!

Heißt Response und wo sehe ich die?
xxx.PNG

Meinst du den SyntaxError aus #4?
wenn du den hier meinst, ja SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data at

Der hat nichts mit JS und JSON zu tun.
wieso? der kommt, weil der JSON-String syntaxfehler enthält. das "unzip.html:119:15".

und dann ist da noch sein problem mit dem readyState 3
 
Sorry hesst, ich hatte garnicht drauf geachtet, dass du das geschrieben hast. Dachte das wäre vom Fragesteller. Und den SyntaxError hätte ich jetzt im PHP verortet. Na mal schauen was er antwortet.
 
hab mal geschaut auf Basic von ajax, das problem ist das es nicht wirklich was geht mit
JSON...

Hier mal ein php Script;
PHP:
<?php  
header('Content-type: text/html; charset=utf-8');  
header("X-Accel-Buffering: no");      
ob_implicit_flush(true);      
ob_end_flush();   

function getAllSubDirectories($directory, $directory_seperator = '/') {
	$dirs = array_map(function($item)use($directory_seperator) {
    	return $item.$directory_seperator; 
  	}, array_filter(glob($directory.'*'), 'is_dir'));
  	foreach($dirs AS $dir) {
    	$dirs = array_merge($dirs, getAllSubDirectories($dir, $directory_seperator));
  	}
  	return $dirs;
} 

$location = '00/phpMyAdmin-4.8.4-english.zip';
$new_location = '00/newfile';

$times = time();
$dirs = '../private/TMP_FTP/'.$_COOKIE['ftpfm'].'_'.$times;
$response = array('message' => 'Bitte Warten, Datei wird vorbereitet!', 'progress' => 0);
echo json_encode($response);

if(exec("unzip ".$location." -d ".$dirs, $arr)) {
	sleep(1);
	@mkdir($dirs);
	$ftp_dirs = getAllSubDirectories($dirs,'/');
	$i='0';
	$j='1';
	$a='0';
	$k = count($arr);
	
	foreach($ftp_dirs as $df) {
		$f_dirs[$i] = str_replace($dirs."/", "", $df);
		
		if($f_dirs[$i]) {
			$f_dir[$i] = $f_dirs[$i];
			mkdir("/web/".$new_location."/".$f_dirs[$i]);
			$txt = $j.'.) Erstelle: '.$f_dirs[$i];
			usleep(150000);
			
			$p = (($j * 100) / $k);   
            $response = array('message' => $txt, 'progress' => $p);
			echo json_encode($response);
			$j++; 
		}
		$i++;
	}
	
	for($i = 1;$i < count($arr); $i++) {
		$file = trim(preg_replace("~inflating: |extracting: |".$dirs."/~", "", $arr[$i]));
		@copy($dirs."/".$file, $new_location."/".$file);
		
		$s = strrpos($file, '/');
		if($s !== false) {
			$s = substr($file, 0, $s);
			$s = $s.'/';
		} else {
			$s = '';
		}
		

		$name = str_replace($s, "", $file);
		if($name) {
			$txt = $j.'.) Entpacke: '.$name;
			usleep(150000);
			$p = (($j * 100) / $k); //Progress      
            $response = array('message' => $txt, 'progress' => $p);
			echo json_encode($response);
			$j++; 
		}
	}
}
exec('rm -rf '.$dirs);
exit();
?>
 
hab mal geschaut auf Basic von ajax, das problem ist das es nicht wirklich was geht mit
JSON...
was soll das bedeuten?
nochmal,
* die vermutung nach #4 war, es liegt am "unzip.html:119:15"
* steht das so in der response oder gehört das zur fehlermeldung?
* gehe im debuger auf den request und poste mal was dort unter antwort steht
* wenn ich dein php mal überfliege, steht dort in einer schleife echo json_encode($response); das wird bei durchläufen > 1 zu {...}{...}
* das ist vermutlich der grund für deinen readystate 3, allerdings muss dann sichergestellt werden, dass
1) der server jede ausgabe auch sofort versendet wird. das erledigt vermutlich header("X-Accel-Buffering: no");
2) der client auch jede ausgabe mit readystate 3 zur bearbeitung bringt und nicht puffert, dazu kann ich nichts sagen, ob und wie sicher das funktioniert(browserübergreifend). Beim IFrame-streaming funktioniert das jedenfalls nicht/hat vor einigen jahren nicht funktioniert. jeder browser hatte teil-antworten gepuffert mit unterschiedlicher puffergröße und erst wenn dieser puffer voll war mit der verarbeitung begonnen. jede server-teil-antwort musste also mit whitespaces je nach browser puffergröße aufgefüllt werden(was das ganze nicht praktikabel macht).
* ist also 1 und 2 sichergestellt?
 
Zurück
Oben