Bei BinärenDaten liefert die Methode Responsetext einen Fehler. Jetzt musst du ResponseBody verwenden.
Dieses liefert dir ein eindimensionales varArray zurück, auf dessen Inhalt du dann folgendermaßen zugreifen kannst:
(Achtung du musst jetzt die
Unit Variants einbinden, welche dein Programm gleich wieder ein schönes Stück größer macht)
Delphi-Quellcode:
var vArray:Variant;
//also anstatt Responsetext:
vArray:=XMLHttpRequest.responsebody;
Zugriff geht jetzt bspw. über vArray[0] bis vArray[x]. Die einzelnen Bytes kannst du jetzt in eine Datei speichern oder anzeigen, wenn du sie interpretieren kannst.
Von wo bis wo das Array im Index läuft bekommst du über die Funktionen varArrayLowBound(vArray,1) und VarArrayHighBound(...) heraus. Die eins steht für die erste Dimension (in diesem Fall ist nur eine zu erwarten)
Mit VarArrayLock bekommst du einen Zeiger auf die gesamten Daten, den man recht simpel speichern kann, das sähe folgendermaßen aus:
Delphi-Quellcode:
procedure SaveToFile(x:Variant);
var len:Integer;
Data:Pointer;
hFile:THandle;
temp:Cardinal;
begin
len:=VarArrayHighBound(x,1)-VarArrayLowBound(x,1);
//Länge ermitteln
Data:=VarArrayLock(x);
//Pointer auf den ArrayInhalt bekommen
try
hfile:=CreateFile('
D:\test.jpg',Generic_Write,0,
nil,Create_Always,0,0);
//Datei öffnen über WinAPI (ich habe als test ein JPG-Bild geladen)
try
Writefile(hfile,Data^,len,temp,
nil);
//Inhalt schreiben (Achtung! Derzeit keine Fehlerbehandlung)
finally
closehandle(hFile);
//Datei schließen
end;
finally
VarArrayUnlock(x);
//Zugriff auf Array wieder freigeben
end;
end;
Edit:
Um ohne den Comfort der
Unit Variants auszukommen (EXE-Datei wird kleiner) geht obige Funktion auch so:
Delphi-Quellcode:
procedure SaveToFile(x:Variant);
var len:Integer;
psa:PSafeArray;
Data:Pointer;
hFile:THandle;
temp:Cardinal;
UBound,LBound:Integer;
begin
psa:=PSafeArray(TVarData(x).VArray);
SafeArrayGetUBound(psa,1,UBound);
SafeArrayGetLBound(psa,1,LBound);
len:=UBound-LBound;
SafeArrayAccessData(psa,Data);
try
hfile:=CreateFile('D:\test.jpg',Generic_Write,0,nil,Create_Always,0,0);
try
Writefile(hfile,Data^,len,temp,nil);
finally
closehandle(hFile);
end;
finally
SafeArrayUnaccessData(psa);
end;
end;
Edit2:
All das funktioniert nur, wenn auf dem Rechner der IE installiert ist (wovon man derzeit noch ausgehen kann). Aber andere Browser gehen eben mit der Änderung des Ressourcenstrings auch (sollten zumindest). Das liegt daran, dass diese Klasse die hier benutzt wird quasi standardisiert ist (den genauen Status kenne ich leider nicht). Und deshalb sind diese Funktionen wohl auch in Linux verfügbar. Wie man das aber dort macht, weiß ich nicht.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.