Einzelnen Beitrag anzeigen

fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#5

AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern

  Alt 18. Jan 2018, 13:43
Hoika, bist offiziell mein Held des Tages.

Die anderen Antworten gingen leider bissel am eigentlichen Problem vorbei.
Die Variable ms hatte ich ursprünglich auch tatsächlich als TmemoryStream deklariert. Nur AddBody hat mit kein TMemoryStream geschluckt. Mir war nicht klar das man TMemoryStream.create auch auf ein Tstream anwenden kann.

Für die die es Interessiert, hab es jetzt so gelöst:


Delphi-Quellcode:
procedure upload(File : olevariant)
var
  ms: TStream;
  p: Pointer;
begin
 ...
 ms := tMemoryStream.create;
 try
  ms.position:=0;
  p := varArrayLock(File);
  ms.Writebuffer(p^,VarArrayHighBound(File,1));
  VarArrayUnlock(File);
  RESTRequest.addbody(ms,ContentType);
  RESTRequest.execute;
 finally
  ms.free;
 end;
end;
Der Vollständigkeit halber noch der Rückweg, der war ja im Beispiel auch mit einem Filestream gelöst!

Delphi-Quellcode:
function download(PfadZumFile:string):olevariant;
var
 lms : tstream;
 buffer : pointer;
begin
 ...
 restclient.baseurl:=PfadZumFile;
 restrequest.execute;
 ...
 lms:=Tmemorystream.create;
 try
  lms.writeData(RestResponse.RawBytes,length(restresponse.rawbytes));
  lms.position:=0;
  result:= VarArrayCreate({0, lms.size -1}, varByte);
  buffer:= VarArrayLock(Result);
  lms.ReadBuffer(Buffer^,lms.size);
  VarArrayUnloack(Result);
 finally
  lms.free;
 end;
end;
Funktioniert super! keine Datei auf der Platte und gefühlt ein wenig schneller
Vielen Dank mal wieder für die schnelle und gute Hilfe.

Gruß
PJM

Geändert von fisipjm (19. Jan 2018 um 06:56 Uhr) Grund: Download eingebunden
  Mit Zitat antworten Zitat