Recent

Author Topic: how to do a file upload with synapse to a url?  (Read 6568 times)

billyb123

  • New Member
  • *
  • Posts: 26
how to do a file upload with synapse to a url?
« on: February 14, 2018, 03:34:40 am »
so I need to upload a file using synapse. I also need to add certain headers to my http post request.
It seems my brain has melted,  I know about HttpPostFile, but I cant add headers to that method?
Basically, my question is (1) how to add headers to HttpPostFile method? or (2) is there a synapse way to simply add file upload to httpmethod method?

Sorry if its a silly question, its 3AM here, my brain has stopped working hours ago.


Code: [Select]
{$mode delphi}

uses sysutils, strutils, httpsend, classes, ssl_openssl, synautil;

var
  http: thttpsend;

begin
  http := thttpsend.create;
  http.headers.add('SOME AUTH HEADER');
  http.headers.add('ANOTHER AUTH HEADER');
  http.headers.add('Content-Type: application/octet-string');
  (* is there a way to simply "add file to upload" without manually editing http request? *)
  http.free;
end.

Thaddy

  • Hero Member
  • *****
  • Posts: 14373
  • Sensorship about opinions does not belong here.
Re: how to do a file upload with synapse to a url?
« Reply #1 on: February 14, 2018, 09:05:26 am »
http://synapse.ararat.cz/doc/help/
Look at HttpPostBinary or HttpPostFile
That may be just what you need.
Object Pascal programmers should get rid of their "component fetish" especially with the non-visuals.

Leledumbo

  • Hero Member
  • *****
  • Posts: 8757
  • Programming + Glam Metal + Tae Kwon Do = Me
Re: how to do a file upload with synapse to a url?
« Reply #2 on: February 15, 2018, 06:16:05 pm »
Looking at THTTPSend documentation, it only provides generic Document property, no easy file upload mechanism, you must build the body manually. If you must use Synapse, I don't think you have any other choice.

rvk

  • Hero Member
  • *****
  • Posts: 6163
Re: how to do a file upload with synapse to a url?
« Reply #3 on: February 15, 2018, 06:27:42 pm »
Looking at THTTPSend documentation, it only provides generic Document property, no easy file upload mechanism, you must build the body manually. If you must use Synapse, I don't think you have any other choice.
Like Thaddy already mentioned, there are functions HttpPostFile() and HttpPostBinary() which already do that work. So there is no need to build the body manually.

The only thing is, if you want to add headers you need to copy that function and do the adding yourself. But that's just a copy/paste and adding a line like:
Code: Pascal  [Select][+][-]
  1. HTTP.Headers.Add('Header: content');

For example, this is the HttpPostFile of Synapse of which you can make a copy:
Code: Pascal  [Select][+][-]
  1. function HttpPostFile(const URL, FieldName, FileName: string;
  2.   const Data: TStream; const ResultData: TStrings): Boolean;
  3. var
  4.   HTTP: THTTPSend;
  5.   Bound, s: string;
  6. begin
  7.   Bound := IntToHex(Random(MaxInt), 8) + '_Synapse_boundary';
  8.   HTTP := THTTPSend.Create;
  9.   try
  10.     s := '--' + Bound + CRLF;
  11.     s := s + 'content-disposition: form-data; name="' + FieldName + '";';
  12.     s := s + ' filename="' + FileName +'"' + CRLF;
  13.     s := s + 'Content-Type: Application/octet-string' + CRLF + CRLF;
  14.     WriteStrToStream(HTTP.Document, s);
  15.     HTTP.Document.CopyFrom(Data, 0);
  16.     s := CRLF + '--' + Bound + '--' + CRLF;
  17.     WriteStrToStream(HTTP.Document, s);
  18.     HTTP.MimeType := 'multipart/form-data; boundary=' + Bound;
  19.     HTTP.Headers.Add('Header: content');
  20.     Result := HTTP.HTTPMethod('POST', URL);
  21.     if Result then
  22.       ResultData.LoadFromStream(HTTP.Document);
  23.   finally
  24.     HTTP.Free;
  25.   end;
  26. end;
So adding a header in there shouldn't be that difficult (I highlighted the line).

billyb123

  • New Member
  • *
  • Posts: 26
Re: how to do a file upload with synapse to a url?
« Reply #4 on: February 19, 2018, 05:41:06 pm »
thanks guys

 

TinyPortal © 2005-2018