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

Azure File Service: Upload File

See more Azure Cloud Storage Examples

Sample code to upload a file to a directory in a share in the Azure File Service. A file is uploaded by first creating the file in the Azure share and then writes a range of bytes to the file. Azure imposes a 4MB limit for each PUT to write a range. Files larger than 4MB need to be uploaded by making multiple "Put Range" calls. This example uploads a file small enough for a single "Put Range" call.

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.BinData,
  Chilkat.Rest,
  Chilkat.AuthAzureStorage,
  Chilkat.StringBuilder;

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

procedure RunDemo;
var
  success: Boolean;
  rest: TRest;
  bTls: Boolean;
  port: Integer;
  bAutoReconnect: Boolean;
  jpgData: TBinData;
  azAuth: TAuthAzureStorage;
  sbFileSize: TStringBuilder;
  responseStr: string;
  sbRange: TStringBuilder;
  sbResponseBody: TStringBuilder;

begin
  success := False;

  //  Azure File Service Example: Upload a file.  
  //  See:  https://docs.microsoft.com/en-us/rest/api/storageservices/create-share
  //  also see: https://docs.microsoft.com/en-us/rest/api/storageservices/put-range

  //  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.file.core.windows.net',port,bTls,bAutoReconnect);
  if (success <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  //  This example will upload a relatively small file (760K), so it may as well 
  //  just be load it into memory..
  jpgData := TBinData.Create;
  jpgData.LoadFile('qa_data/jpg/penguins.jpg');

  //  Provide Azure Cloud credentials for the REST calls.
  azAuth := TAuthAzureStorage.Create;
  azAuth.AccessKey := 'AZURE_ACCESS_KEY';
  //  The account name used here should match the 1st part of the domain passed in the call to Connect (above).
  azAuth.Account := 'chilkat';
  azAuth.Scheme := 'SharedKey';
  azAuth.Service := 'File';
  //  This causes the "x-ms-version: 2021-08-06" header to be automatically added.
  azAuth.XMsVersion := '2021-08-06';
  success := rest.SetAuthAzureStorage(azAuth);

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

  //  However, a few additional headers are required for the "Create File" operation:
  rest.AddHeader('x-ms-type','file');

  //  This required header specifies the final size of the file (or the maximum size it can be).
  sbFileSize := TStringBuilder.Create;
  sbFileSize.AppendInt(jpgData.NumBytes);
  rest.AddHeader('x-ms-content-length',sbFileSize.GetAsString());

  //  Send a PUT request to create the file (or replace the file if it already exists).
  //  This will initialize the file in the Azure file storage.  To upload content, we'll need
  //  to do the "Put Range" operation one or more times.

  //  The following will create the file "penguins.jpg" in the share "pip", in the directory "/wildlife/antarctic"
  responseStr := rest.FullRequestNoBody('PUT','/pip/wildlife/antarctic/penguins.jpg');
  if (rest.LastMethodSuccess <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  //  When successful, the Azure File Service will respond with a 201 (Created) response status code,
  //  with no XML response body.  If an error response is returned, there will be an XML 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): ' + responseStr);
      WriteLn('---');
      WriteLn('LastRequestStartLine: ' + rest.LastRequestStartLine);
      WriteLn('LastRequestHeader: ' + rest.LastRequestHeader);
      Exit;
    end;

  WriteLn('Successfully created penguins.jpg');

  //  --------------------------------------------------------------------------------
  //  Upload the file data...

  //  Make sure the headers from the "Create File" operation are removed.
  rest.ClearAllHeaders();

  //  The only tricky part here is to correctly add the x-ms-range header.
  //  It will be formatted like this:
  //  x-ms-range: bytes=0-759623

  sbRange := TStringBuilder.Create;
  sbRange.Append('bytes=0-');
  sbRange.AppendInt(jpgData.NumBytes - 1);

  rest.AddHeader('x-ms-range',sbRange.GetAsString());

  //  The x-ms-write header is also required:
  rest.AddHeader('x-ms-write','update');

  sbResponseBody := TStringBuilder.Create;
  //  IMPORTANT:  Don't forget the "?comp=range" at the end of the path passed in the 2nd argument.
  success := rest.FullRequestBd('PUT','/pip/wildlife/antarctic/penguins.jpg?comp=range',jpgData,sbResponseBody);
  if (success <> True) then
    begin
      //  This would indicate a failure where no response was received.
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  //  A 201 response indicates the data was uploaded.
  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): ' + responseStr);
      WriteLn('---');
      WriteLn('LastRequestStartLine: ' + rest.LastRequestStartLine);
      WriteLn('LastRequestHeader: ' + rest.LastRequestHeader);
      Exit;
    end;

  WriteLn('Successfully uploaded data into penguins.jpg');


  rest.Free;
  jpgData.Free;
  azAuth.Free;
  sbFileSize.Free;
  sbRange.Free;
  sbResponseBody.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.