![]() |
Bitmap an Formular senden mit Indy
Hallo zusammen,
ich möchte aus meinem Programm ein cgi Formular ausfüllen und damit ein Bild sowie ein paar Textfelder übertragen. Unter D7 wurde das ganze mit einer abgewandelten HTTP Komponente gemacht - nun unter XE2 möchte ich das mit den Indy Komponenten machen. Das ganze klappt auch soweit schon ganz gut, jedoch muss ich noch mein Bild abspeichern und es dann mit AddFile hinzufügen.
Delphi-Quellcode:
Da ich die Bilder, die ich versenden möchte, intern als Bitmap halte möchte ich nun wie gesagt ungern diese erst abspeichern müssen.
Strm := TIdMultipartFormDataStream.Create;
Strm.AddFormField('ac','test'); Strm.AddFormField('prob','test test'); Strm.AddFile('file', 'C:\Bilder\testimage.jpg', 'image/jpg'); Daher habe ich versucht das Bild als Stream zu übertragen, so wie es auch schon mit den D7 Komponenten gemacht wurde.
Delphi-Quellcode:
oder über
bildstream := TMemoryStream.Create();
Image1.Picture.Bitmap.SaveToStream(bildstream); Strm.AddObject('file', 'image/jpg', '', bildstream, 'image.jpg');
Delphi-Quellcode:
beides führt jedoch dazu, dass das Formular mit
strm.AddFormField('file', 'image/jpg', '', bildstream, 'image.jpg');
Error: Datei 'image.jpg' konnte nicht hochgeladen werden ! bzw. nur Dateien der typen .bmp, .gif, .jpg, .kib, .png, .psd, .tga, .tif und .zip können hochgeladen werden antwortet. Wenn ich Wireshark richtig interpretiere wird bei den letzten beiden Aufrufen mit Hilfe des Streams der Inhalt des Bildes auch nicht mit übertragen. Kann mir einer sagen was ich hier falsch mache? Der Aufruf von AddFile läd das Bild ja auch in einen Stream und hängt diesen bei FFiledStream ein. Danke schonmal |
AW: Bitmap an Formular senden mit Indy
speichert denn die Picture.Bitmap.SaveToStream Methode im richtigen Format?
Als Test einfach in einen FileStream schreiben, und die Datei dann öffnen. |
AW: Bitmap an Formular senden mit Indy
das war schonmal ein guter Tipp.
Zum einen habe ich nun ein bmp file anstelle eines jpg in das Image geladen und ich hab in einem anderen Beitrag gefunden, dass man wohl die Position im Stream verändern muss ehe man diesen nutzten kann
Delphi-Quellcode:
bildstream.seek(0,sofromBeginning);
Danach klappt das hier zumindest mal
Delphi-Quellcode:
Wenn ich die Position mittels seek aber auch bei dem TIdMultipartFormDataStream mache so erhalte ich weiterhin die selbe Fehlermeldung - allerdings sehe ich nun mit Wireshark, dass die Nachricht deutlich größer ist und es wird auch in dem Feld name="file" ein Part mit Media Type: image/bmp (9437238) gelistet.
Image1.Picture.Bitmap.SaveToStream(bildstream);
bildstream.seek(0,sofromBeginning); Image2.Picture.Bitmap.LoadFromStream(bildstream); Scheint also schon in die Richtung zu gehen. Hat jemand eine Idee was AddFile anders macht im Vergleich mit AddFormField + Stream? |
AW: Bitmap an Formular senden mit Indy
Hey schwarzerlotus,
wenn du keinen vollständigen Dateinamen angibst (AFileName), zu einer Datei die real existiert, solltest du immer den passenden ContentType (AContentType) übergeben. Die beiden Stellen kannst du dir im Indy-Quellcode auch einfach ansehen, ist sehr übersichtlich. Ich sehe da keine problematischen Unterschiede. Ich weiß aber nicht, welche Indy Version du benutzt, frühere könnten sich da durchaus anders verhalten. Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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-2025 by Thomas Breitkreuz