MeXXi: Binärdatei-Upload mittels JScript und XML-HTTP Post-Request

Ich möchte eine binäre Datei, deren Inhalt ich auslese und mit encodeURIComponent() kodiere, per Post-Request an ein PHP Script senden. Problem: Die Datei kommt nicht so an, wie ich sie sende. Hier der JScript-Code:

  
 var File = new ActiveXObject("Scripting.FileSystemObject");  
 f = File.GetFile(strFilename);  
 is = f.OpenAsTextStream(1,0);  
    var datDp = is.ReadAll();  
 datDp = encodeURIComponent(datDp);  
 is.Close();  
  
 var xml_http = new ActiveXObject("Microsoft.XMLHTTP");  
 xml_http.open("POST", "http://somehost/script.php?user="+strMail, true);  
 xml_http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  
 xml_http.onreadystatechange = function () {  
  if (xml_http.readyState == 4) {  
   DebugTrace("Uploading done. (responseText="+xml_http.responseText+")");  
  }  
 }  
 xml_http.send("datDp="+datDp);  

Wenn ich nun dieselbe Datei stattdessen mittels PHP und

  
<?php  
$fp = fopen($strFile, "r");  
while(!feof($fp))  
 echo rawurlencode(fread($fp, 1024));  
fclose($fp);  
?>  

lese, erhalte ich eine andere Kodierung als oben - obwohl es dieselbe Datei ist. Scheinbar besteht also entweder ein Unterschied zwischen encodeURIComponent() und rawurlencode() oder aber die Datei wird in JScript nicht korrekt eingelesen (OpenAsTextStream() - gibt es Alternativen?).

Für jede Hilfe dankbar...

Gruß MeXXi

--
ie:% fl:{ br:^ va:| ls:[ fo:| rl:? n4:( ss:} de:> js:| ch:? sh:) mo:| zu:}
  1. Hallo,

    ich vermute mal:

    encodeURIComponent kodiert mit UTF-8 - was ziemlicher Unsinn ist, weil du es, wenn du die Binärdatei einliest, vermutlich mit Oktetten zu tun hast, die kein Zeichen bedeuten, sondern nur direkt einen Zahlenwert.

    (Bzw. in JavaScript ist jeder String Zeichen- statt Oktettbasiert, aber der String mit den Binärdaten hat dann halt Zeichen von U+0000 bis U+00FF.)

    Aus einem Oktett 0xF1 (bzw. intern U+00F1) macht encodeURIComponent %C3%B1, aus einem 0xE9 ein %C3%A9. Damit kannst du serverseitig nichts anfangen. Wenn du Binärdaten für den POST-Body kodieren willst, nimm escape(). Dann wird aus 0xF1 %F1 und aus 0xE9 %E9.

    rawurlencode macht nichts anderes, als %XX-Maskierungen umzukehren. Das hieße: Die Datei hat ein Byte 0xF1, encodeURIComponent macht %C3%B1 draus und sendet es so zum Server, rawurlencode macht 0xC3 und 0xB1 draus. Deshalb ist encodeURIComponent ungeeignet.

    Mathias