Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern (https://www.delphipraxis.net/194911-laden-eines-tmemorystream-ein-tstream-ohne-datei-zwischen-zu-speichern.html)

fisipjm 18. Jan 2018 11:17

Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
 
Hi Leute,

ich hoffe mal wieder auf eure Unterstützung.
Zunächst mal die Aufgabenstellung, villeicht bekomme ich das ja auch anders gelöst ;-) also für alle Vorschläge offen!

Aufgabenstellung:

Ich bekomme eine Datei (Word,Excel,Text,Bild,Video,etc...) in Form einer OleVariant.
Derzeit lade ich diese OleVariant in ein TFileSTream um diesen dann wiederrum mit einer Restrequest.addBody an einen Webservice weiter zu reichen. Funktioniert, alles Top!

Was ich nun gerne Sparen würde, wäre die Ablage auf die Platte! Ich brauch die Datei dort nicht, klar könnte ich Sie auch wieder löschen, aber warum einen "langsamen" Zugriff auf die Platte machen, wenn doch alles schon im RAM liegt.

Ich habe mir also gedacht, cool nimmst einfach Vartomemorystream und lädst dir die OLEVariant in ein Memorystream und übergibst den an dein AddBody. Aber Fehlanzeige, leider schluckt der nur Tstream und dafür muss ich wieder auf die Platte, gibts ne Möglichkeit das ganze ohne Schreiben auf die Platte zu lösen?

Gruß
PJM

Redeemer 18. Jan 2018 11:42

AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
 
Delphi-Referenz durchsuchenTStream.CopyFrom?
Beachte, dass es bei Methoden etc., die einfach einen TStream verlangen (wie eben auch CopyFrom), egal ist, was für einen TStream-Erben zu übergibst. Eventuell musst du TStream.Position auf 0 setzen.

Falls das nicht hilft, bitte Minimalbeispiel.

Der schöne Günther 18. Jan 2018 11:51

AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
 
Es gibt alle möglichen TStreams. TFileStream ist nur einer davon. TMemoryStream, TBytesStream, ...

hoika 18. Jan 2018 12:00

AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
 
Hallo,
siehe PDF.

http://www.swissdelphicenter.com/de/...de.php?id=2263

fisipjm 18. Jan 2018 13:43

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

Zitat von hoika (Beitrag 1391295)

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:thumb:
Vielen Dank mal wieder für die schnelle und gute Hilfe.

Gruß
PJM

himitsu 18. Jan 2018 14:02

AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
 
TMemoryStream bietet direkten Zugriff auf seinen Arbeitsspeicher.

Und wenn du die Rückgaben (Result) von Read oder Write nicht auswertest, dann solltest du immer WriteBuffer und ReadBuffer verwenden.

Delphi-Quellcode:
OtherStream.WriteBuffer(MemoryStream.Memory^, MemoryStream.Size);

fisipjm 18. Jan 2018 14:16

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

Zitat von himitsu (Beitrag 1391310)
TMemoryStream bietet direkten Zugriff auf seinen Arbeitsspeicher.

Und wenn du die Rückgaben (Result) von Read oder Write nicht auswertest, dann solltest du immer WriteBuffer und ReadBuffer verwenden.

Delphi-Quellcode:
OtherStream.WriteBuffer(MemoryStream.Memory^, MemoryStream.Size);

Hi Himitsu,
ich befürchte ich verstehe nicht ganz was du meinst, ich schreibe ja aktuell kein MemoryStream in einen anderen sondern eine OLEVariant in den Stream. Ich glaub ich steh Mega auf dem Schlauch :pale:

fisipjm 18. Jan 2018 14:55

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

Zitat von fisipjm (Beitrag 1391313)
Zitat:

Zitat von himitsu (Beitrag 1391310)
TMemoryStream bietet direkten Zugriff auf seinen Arbeitsspeicher.

Und wenn du die Rückgaben (Result) von Read oder Write nicht auswertest, dann solltest du immer WriteBuffer und ReadBuffer verwenden.

Delphi-Quellcode:
OtherStream.WriteBuffer(MemoryStream.Memory^, MemoryStream.Size);

Hi Himitsu,
ich befürchte ich verstehe nicht ganz was du meinst, ich schreibe ja aktuell kein MemoryStream in einen anderen sondern eine OLEVariant in den Stream. Ich glaub ich steh Mega auf dem Schlauch :pale:

Ahhhh, okay hab mich kurz eingelesen. Passt dann so, hab das ms.Write in ms.WriteBuffer geändert! Danke!:thumb:

himitsu 18. Jan 2018 15:00

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

Zitat von fisipjm (Beitrag 1391313)
ich schreibe ja aktuell kein MemoryStream in einen anderen sondern eine OLEVariant in den Stream.

Joar schon, aber
Zitat:

Laden eines TMemoryStream in ein TStream ohne Datei zwischen zu speichern
:angle2:

fisipjm 23. Jan 2018 08:14

AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
 
Kleiner Bugreport. Musste den Code leicht anpassen,
Delphi-Quellcode:
ms.Writebuffer(p^,VarArrayHighBound(File,1));
hat dazu geführt, dass mir die Datei immer um 1 Byte gekürzt wurde. Interessanterweise stört das fast kein Dateiformat :-D
Außer neuere Office Derivate die auf .docx setzen. Dort habe ich nach dem Up- und Download dann immer die Meldung bekommen, dass die Datei beschädigt ist. Also habe ich die Zeile so ergänzt. Korrigiert mich gern wenn das besser geht :-)

Delphi-Quellcode:
ms.Writebuffer(p^,VarArrayHighBound(File,1)+1);
Gruß
PJM


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz