Delphi DLL
Delphi DLL
Download File (Stream to Local Filesystem)
See more Google Drive Examples
This example demonstrates how to download the content of a file from Google Drive. The file is streamed to the local filesystem.Chilkat Delphi DLL Downloads
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Cache, AuthGoogle, Stream, StringBuilder, Rest;
...
procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
gAuth: HCkAuthGoogle;
rest: HCkRest;
bAutoReconnect: Boolean;
gdCache: HCkCache;
fileId: PWideChar;
sbPath: HCkStringBuilder;
fileStream: HCkStream;
jsonResponse: PWideChar;
begin
success := False;
success := True;
// It 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
// Google Drive scope.
gAuth := CkAuthGoogle_Create();
CkAuthGoogle_putAccessToken(gAuth,'GOOGLE_DRIVE_ACCESS_TOKEN');
rest := CkRest_Create();
// Connect using TLS.
// A single REST object, once connected, can be used for many Google Drive REST API calls.
// The auto-reconnect indicates that if the already-established HTTPS connection is closed,
// then it will be automatically re-established as needed.
bAutoReconnect := True;
success := CkRest_Connect(rest,'www.googleapis.com',443,True,bAutoReconnect);
// Provide the authentication credentials (i.e. the access token)
CkRest_SetAuthGoogle(rest,gAuth);
// ------------------------------------------------------------------------------
// To download a file, we must know the file ID.
// In a previous example (see Build Local Metadata Cache
// we built a local cache to make it easy to lookup file IDs given a file path.
// Let's say we want to download "testFolder/abc/123/penguins.jpg".
// First we lookup the fileId in the cache. With the fileId, we can download the file.
gdCache := CkCache_Create();
CkCache_putLevel(gdCache,0);
CkCache_AddRoot(gdCache,'C:/ckCache/googleDrive');
fileId := CkCache__fetchText(gdCache,'testFolder/abc/123/penguins.jpg');
if (CkCache_getLastMethodSuccess(gdCache) <> True) then
begin
Memo1.Lines.Add('Filepath not found in cache.');
Exit;
end;
// We need to send a GET request like this:
// GET https://www.googleapis.com/drive/v3/files/fileId?alt=media
// The fileId is part of the path.
sbPath := CkStringBuilder_Create();
CkStringBuilder_Append(sbPath,'/drive/v3/files/');
CkStringBuilder_Append(sbPath,fileId);
CkRest_AddQueryParam(rest,'alt','media');
// Create a stream object with a SinkFile set to the path where the downloaded file will go.
fileStream := CkStream_Create();
CkStream_putSinkFile(fileStream,'qa_output/penguins.jpg');
// Indicate that the response body should stream directly to fileStream,
// but only if the response status is 200.
CkRest_SetResponseBodyStream(rest,200,True,fileStream);
// Download the file, streaming the content to the SinkFile.
jsonResponse := CkRest__fullRequestNoBody(rest,'GET',CkStringBuilder__getAsString(sbPath));
if (CkRest_getLastMethodSuccess(rest) <> True) then
begin
Memo1.Lines.Add(CkRest__lastErrorText(rest));
Exit;
end;
// A successful response will have a status code equal to 200.
if (CkRest_getResponseStatusCode(rest) <> 200) then
begin
Memo1.Lines.Add('response status code = ' + IntToStr(CkRest_getResponseStatusCode(rest)));
Memo1.Lines.Add('response status text = ' + CkRest__responseStatusText(rest));
Memo1.Lines.Add('response header: ' + CkRest__responseHeader(rest));
Exit;
end;
Memo1.Lines.Add('File downloaded.');
CkAuthGoogle_Dispose(gAuth);
CkRest_Dispose(rest);
CkCache_Dispose(gdCache);
CkStringBuilder_Dispose(sbPath);
CkStream_Dispose(fileStream);
end;