Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

REST Stream Multipart Body from File

See more REST Examples

Demonstrates how to send a multipart/form-data HTTP request, where one of the parts contains data streamed directly from a file. This is good for cases where the file to be uploaded is very large.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.StringBuilder,
  Chilkat.Rest,
  Chilkat.Stream;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  rest: TRest;
  bTls: Boolean;
  port: Integer;
  bAutoReconnect: Boolean;
  sbHtml: TStringBuilder;
  fileStream: TStream;
  responseBody: string;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  rest := TRest.Create;

  //  Connect to the destination web server.
  bTls := True;
  port := 443;
  bAutoReconnect := True;
  success := rest.Connect('www.somewebserver.com',port,bTls,bAutoReconnect);

  //  This example will send the following multipart/form-data request.
  //  The Content-Length is automatically computed and added by Chilkat.

  //  	POST /some_path HTTP/1.1
  //  	Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150
  //  	Content-Length: 834
  //  
  //  	-----------------------------735323031399963166993862150
  //  	Content-Disposition: form-data; name="text1"
  //  
  //  	text 123 abc
  //  	-----------------------------735323031399963166993862150
  //  	Content-Disposition: form-data; name="text2"
  //  
  //  	xyz
  //  	-----------------------------735323031399963166993862150
  //  	Content-Disposition: form-data; name="file1"; filename="a.txt"
  //  	Content-Type: text/plain
  //  
  //  	Content of a.txt.
  //  
  //  	-----------------------------735323031399963166993862150
  //  	Content-Disposition: form-data; name="file2"; filename="a.html"
  //  	Content-Type: text/html
  //  
  //  	<!DOCTYPE html><title>Content of a.html.</title>
  //  
  //  	-----------------------------735323031399963166993862150
  //  	Content-Disposition: form-data; name="file3"; filename="starfish.jpg"
  //  	Content-Type: image/jpeg
  //  
  //  	binary data goes here
  //  	-----------------------------735323031399963166993862150--

  //  Set the Content-Type for the topmost MIME part.
  rest.AddHeader('Content-Type','multipart/form-data');

  //  Specify each part of the request.
  rest.PartSelector := '1';
  rest.AddHeader('Content-Disposition','form-data; name="text1"');
  rest.SetMultipartBodyString('text 123 abc');

  rest.PartSelector := '2';
  rest.AddHeader('Content-Disposition','form-data; name="text2"');
  rest.SetMultipartBodyString('xyz');

  rest.PartSelector := '3';
  rest.AddHeader('Content-Disposition','form-data; name="file1"; filename="a.txt"');
  rest.AddHeader('Content-Type','text/plain');
  rest.SetMultipartBodyString('Content of a.txt.');

  rest.PartSelector := '4';
  rest.AddHeader('Content-Disposition','form-data; name="file2"; filename="a.html"');
  rest.AddHeader('Content-Type','text/html');
  sbHtml := TStringBuilder.Create;
  sbHtml.LoadFile('qa_data/html/a.html','utf-8');
  rest.SetMultipartBodySb(sbHtml);

  rest.PartSelector := '5';
  rest.AddHeader('Content-Disposition','form-data; name="file3"; filename="starfish.jpg"');
  rest.AddHeader('Content-Type','image/jpeg');

  //  When the request is sent, stream this part directly from the file.
  //  This avoids having to load the entire file into memory.
  fileStream := TStream.Create;
  fileStream.SourceFile := 'qa_data/jpg/starfish.jpg';
  rest.SetMultipartBodyStream(fileStream);

  responseBody := rest.FullRequestMultipart('POST','/some_path');
  if (rest.LastMethodSuccess <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  //  ...
  //  ...

  //  Clear the REST object for any subsequent requests..
  rest.ClearAllHeaders();
  rest.ClearAllParts();
  rest.PartSelector := '';


  rest.Free;
  sbHtml.Free;
  fileStream.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.