delphi + indy -> lazarus +synapse

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »


ac
Beiträge: 19
Registriert: Mi 25. Okt 2006, 09:54

Beitrag von ac »

danke,

das habe ich auch schon gesehen aber bin noch nicht ganz durchgestiegen... wie verwende ich diese funktion um mehrere formfields hinzu zu fügen ?

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

ac hat geschrieben:danke,

das habe ich auch schon gesehen aber bin noch nicht ganz durchgestiegen... wie verwende ich diese funktion um mehrere formfields hinzu zu fügen ?


Was verstehst Du denn nicht?

Du kannst doch einfach die FormFields mit Namen und Werten füllen
Feld1=Eins
Feld2=Zwei

Data und FileName kannst du ja wegmachen, wenn du's nicht brauchst.

ac
Beiträge: 19
Registriert: Mi 25. Okt 2006, 09:54

Beitrag von ac »

die formFields habe ich ja schon.

es geht mir darum dass ich einen stream habe und in den die formfields und deren werte reinschreibe. zusätzlich noch ein file. also etwas von synapse dass vergleichbar mit dem TIdMultiPartFormDataStream aus Indy ist.

Mit Indy mache ich (mal grob erklärt) folgendes:
stream.AddFormField(Feld1, Wert1);
stream.AddFormField(Feld2, Wert2);
stream.AddFormField(Feld3, Wert3);
stream.AddFormField(Feld4, Wert4);
stream.AddFile(Feld5, Wert5, Dateityp);
post(url, stream);

Den Stream zum Schluss senden ist kein Problem. Ich frage mich ob es für Synapse einen speziellen stream gibt den man mit FormFields und Files füllen kann.
Wenn Synapse sowas nicht vorgesehen hat, kann man sich irgendwo eine Klasse herunterladen, die das kann? Oder hat jemand eine Idee, wie man so etwas selber bauen kann ?

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

ac hat geschrieben:Den Stream zum Schluss senden ist kein Problem. Ich frage mich ob es für Synapse einen speziellen stream gibt den man mit FormFields und Files füllen kann.


Und wo ist jetzt hier der Unterschied zu dem was hier
http://synapse.ararat.cz/wiki/index.php?page=HtmlForms
gemacht wird?

Data ist der FileStream und FormFields die Namen und Werte Paare.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

So funktioniert's doch:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var Data:TFileStream;
 FormFields:TStrings;
 FileName:String;
begin
 FileName:='/home/theo/test.zip';
 
 Data:=TFileStream.Create(FileName, fmOpenRead);
 
 FormFields:=TStringList.Create;
 FormFields.Add('Feld2=testen');
 FormFields.Add('Feld3=sie mit');
 
 HttpPostFileForm('http://localhost/theohome/php/listpost.php',
  'Feld1',
  ExtractFileName(FileName),
  Data,
  FormFields,
  Memo1.lines);
 
 Data.Free;
 FormFields.free;
end;


Die Konstante CRLF muss du noch definieren als #13#10

ac
Beiträge: 19
Registriert: Mi 25. Okt 2006, 09:54

Beitrag von ac »

der unterschied ist, dass es sich bei der Indy komponente um eine klasse handelt die vorgefertigte funktionen hat, mit denen man alles in einen stream packen kann.

http://synapse.ararat.cz/wiki/index.php?page=HtmlForms ist eine funktion die nur daten sendet. den FileStream und den zusätzlichen TStrings muss ich selber füllen.

und da kommt genau das was ich noch nicht raus habe: wie schreibe ich den inhalt eines bestimmten feldes und den dateityp in den stream?

also wie kann ich "stream.AddFile(Feld5, Wert5, Dateityp); "(was bei indy eine fertige funktion ist) selber machen und den stream mit diesen daten füllen

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

ac hat geschrieben:der unterschied ist, dass es sich bei der Indy komponente um eine klasse handelt die vorgefertigte funktionen hat, mit denen man alles in einen stream packen kann.

http://synapse.ararat.cz/wiki/index.php?page=HtmlForms ist eine funktion die nur daten sendet. den FileStream und den zusätzlichen TStrings muss ich selber füllen.


Na und?

ac hat geschrieben:und da kommt genau das was ich noch nicht raus habe: wie schreibe ich den inhalt eines bestimmten feldes und den dateityp in den stream?

also wie kann ich "stream.AddFile(Feld5, Wert5, Dateityp); "(was bei indy eine fertige funktion ist) selber machen und den stream mit diesen daten füllen


Also Dir fehlt die Angabe für den Dateityp?
Aber du siehst doch wie's in der Wiki Demo gemacht ist.
Du kannst "Application/octet-string" ja mit was anderem ersetzen, wenn du magst.

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Ich brauche wieder hilfe :D

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var responseStream: TFileStream;
    txt: TStrings;
begin
    StringGrid1.RowCount := 2;
    XML := ParamStr(1);
 
    Pfad := ExtractFilePath(Application.ExeName);
 
    responseStream := TFileStream.Create(Pfad+'\la.tmp', fmCreate);
    HttpGetText(XML, txt);
    ShowMessage('Geht noch^^');
    responseStream.WriteAnsiString(txt.Text);
    responseStream.free;


Bei mir geht HttpGetText nicht, da kommt dieser fehler wenn er Http... erreicht hat:
Fehler 1
Fehler 2


Hoffe jemand kennt die Lösung^^

MfG,
Eugen

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ahem... Das ist aber auch ziemlich falsch.

Also du übergibst dem HTTPGetText als URL den XML Parameter den du von
Commandline einliest?
HttpGetText ist so definiert:
function HttpGetText(const URL: string; const Response: TStrings): Boolean;

Ich weiss ja nicht was in XML drinsteht, aber das ist mindestens der falsche Variablenname, der müsste URL heissen.

Dann musst du "txt" createn bevor du's übergibst (txt:=TStringlist.create).

Ich hab dir doch oben ne Demo geschrieben, extra für dich.

Antworten