AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy 9 TIdMultiPartFormDataStream.AddObject macht Probleme
Thema durchsuchen
Ansicht
Themen-Optionen

Indy 9 TIdMultiPartFormDataStream.AddObject macht Probleme

Ein Thema von Codehunter · begonnen am 1. Jun 2006 · letzter Beitrag vom 3. Mär 2007
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Indy 9 TIdMultiPartFormDataStream.AddObject macht Probleme

  Alt 1. Jun 2006, 15:28
Ich führe folgenden Aufruf durch:
AddObject(AFieldName, 'application/octet-stream', AStream, AFilename); Weil man bei AddObject ja einen Filename übergibt und application/octet-stream als Datentyp hätte ich erwartet diese Daten würden dann im PHP auf dem Server in $_FILES landen.

Aber nöööö das landet als einfaches Feld in $_POST und ist dort natürlich nicht in Binärform sondern als MIME kodiert. Ich wills aber als Datei in $_FILES haben.

Soweit ich sagen kann muss es am TIdMultiPartFormDataStream liegen bzw. der Art wie AddObject verwendet wird.

EDIT: Jetzt kommt der Hammer! Der selbe Aufruf von AddObject funktioniert an anderer Stelle im selben Programm fehlerfrei. Einziger Unterschied: Wenn AStream vom Typ TStringStream ist, landet das Ganze als normale $_POST-Variable im PHP. Ist AStream aber ein TMemoryStream oder ein TFileStream, dann als Binärdatei im $_FILES im PHP. Das ist doch zum Mäusemelken

Noch ein EDIT: Jetzt wirds noch verrückter. Der letzte Parameter (AFilename) scheint den Ausschlag zu geben. Auch bei AddObject muss der anscheinend auf eine existierende Datei verweisen. Egal ob AStream ein FileStream auf diese Datei ist oder nicht. Sobald AFilename auf eine existierende Datei verweist wird der Inhalt von AStream als Datei verschickt und nicht als Post-Variable. Da kann ich auch Application.Exename einsetzen, ist vollkommen egal. Hauptsache die Datei ist vorhanden. So ein Unfug :-/
  Mit Zitat antworten Zitat
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Indy 9 TIdMultiPartFormDataStream.AddObject macht Proble

  Alt 1. Mär 2007, 17:41
Ich möchte mit der selben Komponente ein TJPEGImage Objekt als JPEG-Datei auf einen Webserver laden. Mit Zwischenspeichern und AddFile statt AddObject klappt es aber ohne Zwischenspeichern bekomm ich es nicht hin. Kann mir da jemand helfen? Wie muss der AddObject Befehl lauten oder ist das gar nicht der richtige?

Ich habe noch eine zweite Frage. Wärend das Programm mit dem Http.Post beschäftigt ist macht es logischerweise nichts anderes. Bei großen Dateien kann das ganz schön lang sein. Was kann man da tun? Könnte man den Sendenbefehl irgendwie in einen anderen Thread oder sowas auslagern? Ein Stichwort wo ich nachlesen soll würde mir vollkommen reichen.

Danke!
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Indy 9 TIdMultiPartFormDataStream.AddObject macht Proble

  Alt 1. Mär 2007, 18:12
AddObject ist schon genau richtig. Du erstellst dir einfach ein TMemoryStream-Objekt (siehe Hilfe), machst dann bei deinem TJPEGImage ein SaveToStream und diesen Stream übergibst du dann bei AddObject.

Wie ich schon geschrieben hatte: Der Parameter für den Filename muß lediglich auf eine existierende Datei verweisen. Das muß nicht zwingend eine Datei sein, die die zu versendenden Daten enthält. Versendet wird der Inhalt aus dem Stream. Was das mit dem Filename überhaupt soll habe ich nie rausgefunden. Ist evtl. nur ein Bug im Indy.
  Mit Zitat antworten Zitat
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Indy 9 TIdMultiPartFormDataStream.AddObject macht Proble

  Alt 2. Mär 2007, 14:47
Ich hab das jetzt mal so gemacht wie du gesagt hast:

Delphi-Quellcode:
memorystream := Tmemorystream.Create;
JPEG := TJPEGImage.Create;
JPEG.LoadFromFile(filename);
JPEG.SaveToStream(memorystream);
fds := TIdMultiPartFormDataStream.Create;
fds.AddObject('archive','application/x-www-form-urlencoded',memorystream,Application.ExeName);
Application.ExeName soll einfach ein existierendes file sein. Dummerweise läd er jetzt die eigene exe auf den server
Ich hab indy 7/delphi 7, das könnte erklären warum ich den "Bug" nicht hab. Leider bin ich jetzt immernoch ratlos wie ich das Bild hochlade. Mit nem leeren String als letztem Parameter passiert einfach garnichts.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Indy 9 TIdMultiPartFormDataStream.AddObject macht Proble

  Alt 2. Mär 2007, 14:55
Na wenn er die exe hochlädt ist doch gut. Gibste halt den Pfad zur Bilddatei an. Dann kannst du dir den Umweg über TJPEGImage komplett sparen wenn die Datei ohnehin schon vorhanden ist.

Allerdings, der Workaround mit der beliebigen Datei ist für Indy 9 gedacht, nicht Indy 7.
  Mit Zitat antworten Zitat
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Indy 9 TIdMultiPartFormDataStream.AddObject macht Proble

  Alt 2. Mär 2007, 15:06
nee das mit dem direkten laden der datei war nur zum test. ich verändere das jpeg im programm.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Indy 9 TIdMultiPartFormDataStream.AddObject macht Proble

  Alt 2. Mär 2007, 15:14
Irgendwo erschließt sich mir der Sinn sowieso nicht warum AddObject nun einen Stream- UND einen File-Parameter hat. Im Indy 9-Quelltext wird der Filename nur auf Existenz geprüft und dann verworfen um den Stream hochzuladen. Bei Indy 7 scheints wieder anders zu sein aber auch nicht sinniger.
  Mit Zitat antworten Zitat
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Indy 9 TIdMultiPartFormDataStream.AddObject macht Proble

  Alt 3. Mär 2007, 10:17
fds.AddObject('archive', 'image/jpeg', memorystream, test.jpg);

funktioniert. war einfach nur der falsche content typ.
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:58 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