[Previous][Up][Next] Reference for unit 'fpHTTPClient' (#fcl)

Form Data and File Upload with fpHttpClient

The TFPHTTPClient class provides specialized methods for posting form data and uploading files. FormPost handles URL-encoded form data, while FileFormPost uploads files using multipart/form-data encoding.

program FormPostExample;

{$mode objfpc}{$H+}

uses
  SysUtils, Classes, fphttpclient, opensslsockets;

var
  Client: TFPHTTPClient;
  FormData: TStrings;
  Response: String;
  FileStream: TFileStream;
begin
  Client := TFPHTTPClient.Create(nil);
  FormData := TStringList.Create;
  try
    // Simple form post with key-value pairs
    Writeln('=== Form Post Example ===');
    FormData.Values['username'] := 'testuser';
    FormData.Values['email'] := 'test@example.com';
    FormData.Values['message'] := 'Hello from FreePascal!';

    Response := Client.FormPost('https://httpbin.org/post', FormData);
    Writeln('Form POST response: ', Copy(Response, 1, 150), '...');

    // Form post with raw data
    Writeln('=== Raw Form Data Post ===');
    Response := Client.FormPost('https://httpbin.org/post', 'field1=value1&field2=value2');
    Writeln('Raw form POST status: ', Client.ResponseStatusCode);

    // File upload using FileFormPost
    Writeln('=== File Upload Example ===');

    // Create a test file to upload
    FileStream := TFileStream.Create('/tmp/claude/test_upload.txt', fmCreate);
    try
      FileStream.WriteAnsiString('This is test content for file upload');
    finally
      FileStream.Free;
    end;

    // Upload the file
    Client.FileFormPost('https://httpbin.org/post', 'file', '/tmp/claude/test_upload.txt',
                        TStringStream.Create(''));

    Writeln('File upload status: ', Client.ResponseStatusCode);
    if Client.ResponseStatusCode = 200 then
      Writeln('File uploaded successfully');

    // Clean up test file
    if FileExists('/tmp/claude/test_upload.txt') then
      DeleteFile('/tmp/claude/test_upload.txt');

  finally
    FormData.Free;
    Client.Free;
  end;
end.

Documentation generated on: Jan 27 2026