DataFlex
DataFlex
Google Drive - Resumable Upload
See more Google Drive Examples
Demonstrates how to do a resumable upload to Google Drive.Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoHttp
Variant vJson
Handle hoJson
Variant vResp
Handle hoResp
Integer iStatusCode
Handle hoSbSessionUri
String sSessionUri
Variant vReq
Handle hoReq
Handle hoUrl
String sTemp1
Integer iTemp1
Boolean bTemp1
Move False To iSuccess
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
Move True To iSuccess
// This example uses a previously obtained access token having permission for the
// Google Drive scope.
// See Get Google Drive OAuth2 Access Token
Get Create (RefClass(cComChilkatHttp)) To hoHttp
If (Not(IsComObjectCreated(hoHttp))) Begin
Send CreateComObject of hoHttp
End
Set ComAuthToken Of hoHttp To "GOOGLE_DRIVE_ACCESS_TOKEN"
// First we want to initiate the resumable upload.
// We send a POST to get a session URI, which will be used to upload the file, and resume if needed.
// Our POST will look like this:
// POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable HTTP/1.1
// Authorization: Bearer [YOUR_AUTH_TOKEN] <-- Chilkat automatically adds this header because the AuthToken property was set.
// Content-Length: 38 <-- Chilkat will automatically add this header.
// Content-Type: application/json; charset=UTF-8 <-- This is the type of this POST, and is specified in the call to HttpJson.
// X-Upload-Content-Type: application/zip <-- The type of file we'll be uploading
// X-Upload-Content-Length: 1366807 <-- The size of the file we'll be uploading
//
// {
// "name": "myObject"
// }
Send ComSetRequestHeader To hoHttp "X-Upload-Content-Type" "application/zip"
Send ComSetRequestHeader To hoHttp "X-Upload-Content-Length" "1366807"
Get Create (RefClass(cComChilkatJsonObject)) To hoJson
If (Not(IsComObjectCreated(hoJson))) Begin
Send CreateComObject of hoJson
End
Get ComUpdateString Of hoJson "name" "myZip" To iSuccess
Get Create (RefClass(cComChilkatHttpResponse)) To hoResp
If (Not(IsComObjectCreated(hoResp))) Begin
Send CreateComObject of hoResp
End
Get pvComObject of hoJson to vJson
Get pvComObject of hoResp to vResp
Get ComHttpJson Of hoHttp "POST" "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable" vJson "application/json" vResp To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoHttp To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComStatusCode Of hoResp To iStatusCode
If (iStatusCode <> 200) Begin
Get ComBodyStr Of hoResp To sTemp1
Showln sTemp1
Showln "response status = " iStatusCode
Procedure_Return
End
// The session URI is in the "Location" response header:
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbSessionUri
If (Not(IsComObjectCreated(hoSbSessionUri))) Begin
Send CreateComObject of hoSbSessionUri
End
Get ComGetHeaderField Of hoResp "Location" To sTemp1
Get ComAppend Of hoSbSessionUri sTemp1 To iSuccess
Get ComGetAsString Of hoSbSessionUri To sSessionUri
Showln "Session URI: " sSessionUri
// Here's a sample session URI: https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&upload_id=AEnB2UrszR8lDqlo3mtXJw_0rYI_Hi1oVh1NPFcLfoyBq9NcSjk85kFopoZaVEgT38OSmLl0XsObPf4iCSJwHlrOvvIJQ_ckIQ
// -----------------------------------------------------------------------------
// The next step is to upload the file using the session URI:
// We'll send a PUT that looks like this:
// PUT https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&upload_id=xa298sd_sdlkj2 HTTP/1.1
// Content-Length: 1366807
// Content-Type: application/zip
//
// [BYTES 0-1366806]
// First remove the X-Upload-Content-Type and X-Upload-Content-Length request headers we specified earlier, so they don't get sent with subsequent requests.
Send ComClearHeaders To hoHttp
// Because the file is likely large, we'll use HttpSReq which allows to to pass an HTTP request object where the body can be streamed directly from a file.
Get Create (RefClass(cComChilkatHttpRequest)) To hoReq
If (Not(IsComObjectCreated(hoReq))) Begin
Send CreateComObject of hoReq
End
Set ComContentType Of hoReq To "application/zip"
Set ComHttpVerb Of hoReq To "PUT"
Get Create (RefClass(cComChilkatUrl)) To hoUrl
If (Not(IsComObjectCreated(hoUrl))) Begin
Send CreateComObject of hoUrl
End
Get ComParseUrl Of hoUrl sSessionUri To iSuccess
Get ComPathWithQueryParams Of hoUrl To sTemp1
Set ComPath Of hoReq To sTemp1
Get ComPathWithQueryParams Of hoUrl To sTemp1
Showln "Path with Query Param: " sTemp1
// Specify that the request body is to be streamed directly from a file.
Get ComStreamBodyFromFile Of hoReq "qa_data/zips/big.zip" To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoReq To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComHost Of hoUrl To sTemp1
Get ComPort Of hoUrl To iTemp1
Get ComSsl Of hoUrl To bTemp1
Get pvComObject of hoReq to vReq
Get pvComObject of hoResp to vResp
Get ComHttpSReq Of hoHttp sTemp1 iTemp1 bTemp1 vReq vResp To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoHttp To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComBodyStr Of hoResp To sTemp1
Showln sTemp1
Get ComStatusCode Of hoResp To iTemp1
Showln "response status = " iTemp1
// Sample output:
// {
// "kind": "drive#file",
// "id": "1rx20i53eurtkVQ-RT7Ry8Ct85PgPYMET",
// "name": "myZip",
// "mimeType": "application/zip"
// }
//
// response status = 200
End_Procedure