Synapse HttpPostFile - wie funktioniert es?

Alle Fragen zur Netzwerkkommunikation
Antworten
chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Synapse HttpPostFile - wie funktioniert es?

Beitrag von chickendev »

Hallo,

ich versuche verzweifelt mit Synapse eine Datei über HTTP/Post zu versenden, überall findet man die entsprechende Funktion. Aber nirgendwo gibt es ein entsprechendes Beispiel wie man die Funktion aufruft.

Ich muss unter Angabe eines Dateinamens eine Datei senden, ich verstehe aber leider nicht wie ich const Data: TStream; const ResultData: TStrings): verwenden soll, hat da jemand eine Idee?

Danke

Code: Alles auswählen

function HttpPostFile(const URL, FieldName, FileName: string;
  const Data: TStream; const ResultData: TStrings): Boolean;
var
  HTTP: THTTPSend;
  Bound, s: string;
begin
  Bound := IntToHex(Random(MaxInt), 8) + '_Synapse_boundary';
  HTTP := THTTPSend.Create;
  try
    s := '--' + Bound + CRLF;
    s := s + 'content-disposition: form-data; name="' + FieldName + '";';
    s := s + ' filename="' + FileName +'"' + CRLF;
    s := s + 'Content-Type: Application/octet-string' + CRLF + CRLF;
    WriteStrToStream(HTTP.Document, s);
    HTTP.Document.CopyFrom(Data, 0);
    s := CRLF + '--' + Bound + '--' + CRLF;
    WriteStrToStream(HTTP.Document, s);
    HTTP.MimeType := 'multipart/form-data; boundary=' + Bound;
    Result := HTTP.HTTPMethod('POST', URL);
    if Result then
      ResultData.LoadFromStream(HTTP.Document);
  finally
    HTTP.Free;
  end;
end;


chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Re: Synapse HttpPostFile - wie funktioniert es?

Beitrag von chickendev »

Also so in etwa verstehe ich das *duck*, das Problem ist, ich finde leider kein einziges Beispiel wie man praktisch die Funktion aufrufen könnte, es gibt anscheinend kein einziges Beispiel.

Meine Idee wäre folgende, es scheitert aber an den letzten beiden da ich u.a. nicht genau verstehe wieso überhaupt Konstanten verwendet werden. Für jede Idee würde ich mich freuen :-)

Code: Alles auswählen

procedure send ( FileName : String );
begin
  { function HttpPostFile(const URL, FieldName, FileName: string;
  const Data: TStream; const ResultData: TStrings): Boolean;}

  HttpPostFile('http://mein.url', 'datei', FileName,
    ??, ?? );
end;

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Synapse HttpPostFile - wie funktioniert es?

Beitrag von Socke »

chickendev hat geschrieben:Meine Idee wäre folgende, es scheitert aber an den letzten beiden da ich u.a. nicht genau verstehe wieso überhaupt Konstanten verwendet werden.

Wenn const vor einem Parameter steht heißt das: der Programmierer ändert den Inhalt dieser Variablen während der Funktion nicht. Dadurch kann der Compiler ein paar Optimierungen vornehmen.
In diesem Fall ist das ziemlich sinnlos. Die Variablen enthalten Referenzen (d.h. Zeiger) auf die eigentlichen Objektdaten. Das const bezieht sich aber nur auf die Referenz, also auf den Zeiger. Das Objekt kann trotzdem geändert werden.

Zu der Funktion gibt es sogar eine offizielle Dokumentation. Dazu empfehle ich eine entsprechende Dokumentation zu HTTP -- insbesondere Dateiübertragung und Formulardaten -- zu lesen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Synapse HttpPostFile - wie funktioniert es?

Beitrag von m.fuchs »

Socke hat geschrieben:Wenn const vor einem Parameter steht heißt das: der Programmierer ändert den Inhalt dieser Variablen während der Funktion nicht. Dadurch kann der Compiler ein paar Optimierungen vornehmen.
In diesem Fall ist das ziemlich sinnlos. Die Variablen enthalten Referenzen (d.h. Zeiger) auf die eigentlichen Objektdaten. Das const bezieht sich aber nur auf die Referenz, also auf den Zeiger. Das Objekt kann trotzdem geändert werden.

Das ist nicht sinnlos. Auf diese Art ist sichergestellt, dass die übergebene Referenz innerhalb der Prozedur nicht verbogen werden. Im Hinblick auf Speicherlecks ist das wichtig.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Re: Synapse HttpPostFile - wie funktioniert es?

Beitrag von chickendev »

Socke hat geschrieben:Zu der Funktion gibt es sogar eine offizielle Dokumentation. Dazu empfehle ich eine entsprechende Dokumentation zu HTTP -- insbesondere Dateiübertragung und Formulardaten -- zu lesen.


Leider gibt es für die entsprechende Funktion kein praktisches Beispiel, da habe ich auch schon gesehen :-/

chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Re: Synapse HttpPostFile - wie funktioniert es?

Beitrag von chickendev »

Ich hab es hinbekommen!! :-)

Hier ein Beispielcode:

Code: Alles auswählen

rocedure TForm1.Button2Click(Sender: TObject);
var
  Stream: TStream;
  List: TStringList;
  FileName : String;
begin
  FileName := 'testfile2';
  Stream := TFileStream.Create(FileName, fmOpenRead);
  List:=TStringList.Create;
 
  if HttpPostFile('http://receive.cxxxxxxnet/', 'datei', FileName, Stream, List) then begin
    ShowMessage('OK');
    Showmessage(List.Text);
  end else begin
    ShowMessage('FAIL');
    Showmessage(List.Text);
  end;
 
 
  Stream.Free;
  List.Free;
end;

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Synapse HttpPostFile - wie funktioniert es?

Beitrag von Socke »

m.fuchs hat geschrieben:Das ist nicht sinnlos. Auf diese Art ist sichergestellt, dass die übergebene Referenz innerhalb der Prozedur nicht verbogen werden. Im Hinblick auf Speicherlecks ist das wichtig.

Der Compiler sagt dir: Hey, du darfst dieser Variable keinen neuen Wert zuweisen. Aber warum solltest du das auch tun wollen? Ein Speicherleck kann ich damit weder erzeugen noch verhindern. Man kann sowohl nil übergeben (kein Objekt), als auch das Objekt in der Funktion freigeben. Das sind zwar konstruierte Möglichkeiten, aber der const-Modifikator ändert nichts daran (das geht auch ohne).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Re: Synapse HttpPostFile - wie funktioniert es?

Beitrag von chickendev »

Muss man bei dem konvertieren eines "String" in einen "Stream" irgendwas beachten?

Ich hab hiermit mein String convertiert, aber damit sind die Strings nur zwischen 5 und 150 byte (statt 32kb) lang, trotz alle 32KB sind?

Code: Alles auswählen

Function StringToStream(const AString: string): TStream;
begin
  Result := TStringStream.Create(AString);
end;

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

Re: Synapse HttpPostFile - wie funktioniert es?

Beitrag von theo »

chickendev hat geschrieben:Ich hab hiermit mein String convertiert, aber damit sind die Strings nur zwischen 5 und 150 byte (statt 32kb) lang, trotz alle 32KB sind?


Und woher glaubst du das zu wissen?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Synapse HttpPostFile - wie funktioniert es?

Beitrag von m.fuchs »

Socke hat geschrieben:
m.fuchs hat geschrieben:Das ist nicht sinnlos. Auf diese Art ist sichergestellt, dass die übergebene Referenz innerhalb der Prozedur nicht verbogen werden. Im Hinblick auf Speicherlecks ist das wichtig.

Der Compiler sagt dir: Hey, du darfst dieser Variable keinen neuen Wert zuweisen. Aber warum solltest du das auch tun wollen? Ein Speicherleck kann ich damit weder erzeugen noch verhindern. Man kann sowohl nil übergeben (kein Objekt), als auch das Objekt in der Funktion freigeben. Das sind zwar konstruierte Möglichkeiten, aber der const-Modifikator ändert nichts daran (das geht auch ohne).

Naja es hilft zum Beispiel, wenn man konsequent alle lokalen Variablen immer zerstört und sichergehen möchte, dass man nicht aus Versehen einen der Parameter als lokale Variable missbraucht hat. Aber ich gebe zu, dass das wirklich eher konstruiert ist.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten