delphi + indy -> lazarus +synapse
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.
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 ?
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 ?
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.
So funktioniert's doch:
Die Konstante CRLF muss du noch definieren als #13#10
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
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
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
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.
-
- 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:
Ich brauche wieder hilfe
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
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
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.
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.