![]() |
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 |
AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
![]() 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. |
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, ...
|
AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
|
AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
Zitat:
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:
Der Vollständigkeit halber noch der Rückweg, der war ja im Beispiel auch mit einem Filestream gelöst!
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;
Delphi-Quellcode:
Funktioniert super! keine Datei auf der Platte und gefühlt ein wenig schneller:thumb:
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; Vielen Dank mal wieder für die schnelle und gute Hilfe. Gruß PJM |
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);
|
AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
Zitat:
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: |
AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
Zitat:
|
AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
Zitat:
Zitat:
|
AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
Kleiner Bugreport. Musste den Code leicht anpassen,
Delphi-Quellcode:
hat dazu geführt, dass mir die Datei immer um 1 Byte gekürzt wurde. Interessanterweise stört das fast kein Dateiformat :-D
ms.Writebuffer(p^,VarArrayHighBound(File,1));
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:
Gruß
ms.Writebuffer(p^,VarArrayHighBound(File,1)+1);
PJM |
AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
Wenn schon, dann besser gleich
Delphi-Quellcode:
.
VarArrayHighBound(File,1)-VarArrayLowBound(File,1)+1
VarArrays müssen nicht bei 0 beginnen. |
AW: Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz