Sample code for 30+ languages & platforms
Delphi DLL

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 Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, StringBuilder, Rest, Stream;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
rest: HCkRest;
bTls: Boolean;
port: Integer;
bAutoReconnect: Boolean;
sbHtml: HCkStringBuilder;
fileStream: HCkStream;
responseBody: PWideChar;

begin
success := False;

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

rest := CkRest_Create();

// Connect to the destination web server.
bTls := True;
port := 443;
bAutoReconnect := True;
success := CkRest_Connect(rest,'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.
CkRest_AddHeader(rest,'Content-Type','multipart/form-data');

// Specify each part of the request.
CkRest_putPartSelector(rest,'1');
CkRest_AddHeader(rest,'Content-Disposition','form-data; name="text1"');
CkRest_SetMultipartBodyString(rest,'text 123 abc');

CkRest_putPartSelector(rest,'2');
CkRest_AddHeader(rest,'Content-Disposition','form-data; name="text2"');
CkRest_SetMultipartBodyString(rest,'xyz');

CkRest_putPartSelector(rest,'3');
CkRest_AddHeader(rest,'Content-Disposition','form-data; name="file1"; filename="a.txt"');
CkRest_AddHeader(rest,'Content-Type','text/plain');
CkRest_SetMultipartBodyString(rest,'Content of a.txt.');

CkRest_putPartSelector(rest,'4');
CkRest_AddHeader(rest,'Content-Disposition','form-data; name="file2"; filename="a.html"');
CkRest_AddHeader(rest,'Content-Type','text/html');
sbHtml := CkStringBuilder_Create();
CkStringBuilder_LoadFile(sbHtml,'qa_data/html/a.html','utf-8');
CkRest_SetMultipartBodySb(rest,sbHtml);

CkRest_putPartSelector(rest,'5');
CkRest_AddHeader(rest,'Content-Disposition','form-data; name="file3"; filename="starfish.jpg"');
CkRest_AddHeader(rest,'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 := CkStream_Create();
CkStream_putSourceFile(fileStream,'qa_data/jpg/starfish.jpg');
CkRest_SetMultipartBodyStream(rest,fileStream);

responseBody := CkRest__fullRequestMultipart(rest,'POST','/some_path');
if (CkRest_getLastMethodSuccess(rest) <> True) then
  begin
    Memo1.Lines.Add(CkRest__lastErrorText(rest));
    Exit;
  end;

// ...
// ...

// Clear the REST object for any subsequent requests..
CkRest_ClearAllHeaders(rest);
CkRest_ClearAllParts(rest);
CkRest_putPartSelector(rest,'');

CkRest_Dispose(rest);
CkStringBuilder_Dispose(sbHtml);
CkStream_Dispose(fileStream);

end;