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

Use an Azure Service SAS

See more Azure Cloud Storage Examples

Shows how to use an Azure Service SAS. (In this case, it is an SAS for a blob.)

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.BinData;

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

procedure RunDemo;
var
  success: Boolean;
  rest: TRest;
  bTls: Boolean;
  port: Integer;
  bAutoReconnect: Boolean;
  sbToken: TStringBuilder;
  binData: TBinData;
  sbResponse: TStringBuilder;

begin
  success := False;

  //  Azure Blob Service Example: Upload binary bytes to a block blob.
  //  This uses a Service SAS for Authorization.

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

  rest := TRest.Create;

  //  Connect to the Azure Storage Blob Service
  bTls := True;
  port := 443;
  bAutoReconnect := True;
  //  In this example, the storage account name is "chilkat".
  success := rest.Connect('chilkat.blob.core.windows.net',port,bTls,bAutoReconnect);
  if (success <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  //  ----------------------------------------------------------------------------------------------
  //  The code above this comment could be placed inside a function/subroutine within the application
  //  because the connection does not need to be made for every request.  Once the connection is made
  //  the app may send many requests..
  //  ----------------------------------------------------------------------------------------------

  //  Note: The application does not need to explicitly set the following
  //  headers: Content-Length, x-ms-date, Authorization.  These headers
  //  are automatically set by Chilkat.

  //  Let's load a previously computed Azure Storage Account SAS token and use it.
  //  See How to Create an Azure Service SAS
  sbToken := TStringBuilder.Create;
  success := sbToken.LoadFile('qa_data/tokens/azureStorageServiceSas.txt','utf-8');
  if (success <> True) then
    begin
      WriteLn('Failed to load SAS token.');
      Exit;
    end;

  //  Add the Shared Access Signature query params for authorization.
  rest.AddQueryParams(sbToken.GetAsString());

  //  IMPORTANT: Make sure to set the x-ms-blob-type header:
  success := rest.AddHeader('x-ms-blob-type','BlockBlob');

  //  IMPORTANT: Make sure to add the x-ms-date header.
  //  When the header name is "x-ms-date", Chilkat will recognize the keyword "NOW" 
  //  and will substitute the current system date/time formatted as required by Microsoft.
  success := rest.AddHeader('x-ms-date','NOW');

  //  For this example, we'll just load a JPG file into memory..
  binData := TBinData.Create;
  success := binData.LoadFile('qa_data/jpg/starfish.jpg');
  if (success <> True) then
    begin
      WriteLn('Failed to load JPG file.');
      Exit;
    end;

  //  Note: The maximum size of a block blob created by uploading in a single step is 64MB.  
  //  For larger files, the upload must be broken up into blocks.  There is another Chilkat example for that..
  sbResponse := TStringBuilder.Create;
  success := rest.FullRequestBd('PUT','/mycontainer/starfish.jpg',binData,sbResponse);
  if (success <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  //  When successful, the Azure Storage service will respond with a 201 response status code,
  //  with no response body.
  if (rest.ResponseStatusCode <> 201) then
    begin
      //  Examine the request/response to see what happened.
      WriteLn('response status code = ' + rest.ResponseStatusCode);
      WriteLn('response status text = ' + rest.ResponseStatusText);
      WriteLn('response header: ' + rest.ResponseHeader);
      WriteLn('response body (if any): ' + sbResponse.GetAsString());
      WriteLn('---');
      WriteLn('LastRequestStartLine: ' + rest.LastRequestStartLine);
      WriteLn('LastRequestHeader: ' + rest.LastRequestHeader);
      WriteLn('Failed.');
      Exit;
    end;

  WriteLn('Success.');


  rest.Free;
  sbToken.Free;
  binData.Free;
  sbResponse.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.