AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern

Ein Thema von fisipjm · begonnen am 18. Jan 2018 · letzter Beitrag vom 24. Jan 2018
Antwort Antwort
Seite 1 von 2  1 2      
fisipjm

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

Laden eines tMemoryStream in ein Tstream ohne Datei zwischen zu speichern

  Alt 18. Jan 2018, 11:17
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
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.017 Beiträge
 
Delphi 2009 Professional
 
#2

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

  Alt 18. Jan 2018, 11:42
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 18. Jan 2018, 11:51
Es gibt alle möglichen TStreams. TFileStream ist nur einer davon. TMemoryStream, TBytesStream, ...
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 18. Jan 2018, 12:00
Hallo,
siehe PDF.

http://www.swissdelphicenter.com/de/...de.php?id=2263
Heiko
  Mit Zitat antworten Zitat
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 18. Jan 2018, 14:02
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.

OtherStream.WriteBuffer(MemoryStream.Memory^, MemoryStream.Size);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
fisipjm

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

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

  Alt 18. Jan 2018, 14:16
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.

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
  Mit Zitat antworten Zitat
fisipjm

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

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

  Alt 18. Jan 2018, 14:55
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.

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
Ahhhh, okay hab mich kurz eingelesen. Passt dann so, hab das ms.Write in ms.WriteBuffer geändert! Danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 18. Jan 2018, 15:00
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
fisipjm

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

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

  Alt 23. Jan 2018, 08:14
Kleiner Bugreport. Musste den Code leicht anpassen,
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
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

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

Geändert von fisipjm (23. Jan 2018 um 08:15 Uhr) Grund: Rechtschreibung
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 Uhr.
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