Sample code for 30+ languages & platforms
Delphi DLL

Upload Filename with SPACE Chars to Google Cloud Storage

See more Google Cloud Storage Examples

Demonstrates how to upload a file with SPACE chars in the name to Google Cloud Storage.

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, Http, StringBuilder, HttpResponse, HttpRequest;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
sbToken: HCkStringBuilder;
http: HCkHttp;
sbPath: HCkStringBuilder;
numReplaced: Integer;
req: HCkHttpRequest;
resp: HCkHttpResponse;
responseCode: Integer;

begin
success := False;

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

// This example uses a previously obtained access token having permission for the 
// scope "https://www.googleapis.com/auth/cloud-platform"

// In this example, Get Google Cloud Storage OAuth2 Access Token, 
// the service account access token was saved to a text file.  This example fetches the access token from the file..
sbToken := CkStringBuilder_Create();
CkStringBuilder_LoadFile(sbToken,'qa_data/tokens/googleCloudStorageAccessToken.txt','utf-8');

// Send a POST equivalent to this curl command.
// The content of the file is contained in the request body.

// curl -X POST --data-binary @[OBJECT] \
//     -H "Authorization: Bearer [OAUTH2_TOKEN]" \
//     -H "Content-Type: [OBJECT_CONTENT_TYPE]" \
//     "https://www.googleapis.com/upload/storage/v1/b/[BUCKET_NAME]/o?uploadType=media&name=[OBJECT_NAME]"

http := CkHttp_Create();
CkHttp_putAuthToken(http,CkStringBuilder__getAsString(sbToken));

// Use %20 for the SPACE chars in the path.
sbPath := CkStringBuilder_Create();
CkStringBuilder_Append(sbPath,'/upload/storage/v1/b/bucket_name/o?uploadType=media&name=file%20with%20space%20char.jpg');
numReplaced := CkStringBuilder_Replace(sbPath,'bucket_name','chilkat-ocean');

req := CkHttpRequest_Create();
CkHttpRequest_putHttpVerb(req,'POST');
CkHttpRequest_putPath(req,CkStringBuilder__getAsString(sbPath));
CkHttpRequest_putContentType(req,'image/jpeg');
// Indicate the file to be streamed in the request body when the HTTP POST is sent.
// Use SPACE chars directly in the local file path.
CkHttpRequest_StreamBodyFromFile(req,'qa_data/jpg/file with space char.jpg');

resp := CkHttpResponse_Create();
success := CkHttp_HttpSReq(http,'www.googleapis.com',443,True,req,resp);
if (success = False) then
  begin
    Memo1.Lines.Add(CkHttp__lastErrorText(http));
    Exit;
  end;

responseCode := CkHttpResponse_getStatusCode(resp);
if (responseCode = 401) then
  begin
    Memo1.Lines.Add(CkHttpResponse__bodyStr(resp));
    Memo1.Lines.Add('If invalid credentials, then it is likely the access token expired.');
    Memo1.Lines.Add('Your app should automatically fetch a new access token and re-try.');
    Exit;
  end;

Memo1.Lines.Add('Response code: ' + IntToStr(responseCode));
Memo1.Lines.Add('Response body');
Memo1.Lines.Add(CkHttpResponse__bodyStr(resp));

// A successful response looks like this:
// Response code: 200
// Response body
// {
//  "kind": "storage#object",
//  "id": "chilkat-ocean/file with space char.jpg/1502643657837855",
//  "selfLink": "https://www.googleapis.com/storage/v1/b/chilkat-ocean/o/file with space char.jpg",
//  "name": "file with space char.jpg",
//  "bucket": "chilkat-ocean",
//  "generation": "1502643657837855",
//  "metageneration": "1",
//  "contentType": "image/jpeg",
//  "timeCreated": "2017-08-13T17:00:57.811Z",
//  "updated": "2017-08-13T17:00:57.811Z",
//  "storageClass": "MULTI_REGIONAL",
//  "timeStorageClassUpdated": "2017-08-13T17:00:57.811Z",
//  "size": "777835",
//  "md5Hash": "nTd7EM53jEk4s8fixjoimg==",
//  "mediaLink": "https://www.googleapis.com/download/storage/v1/b/chilkat-ocean/o/file with space char.jpg?generation=1502643657837855&alt=media",
//  "crc32c": "ixxYVw==",
//  "etag": "CJ+azOvX1NUCEAE="
// }

CkStringBuilder_Dispose(sbToken);
CkHttp_Dispose(http);
CkStringBuilder_Dispose(sbPath);
CkHttpRequest_Dispose(req);
CkHttpResponse_Dispose(resp);

end;