Lua Requires Chilkat v11.0.0+
Lua
Google Drive - Resumable Upload
See more Google Drive Examples
Demonstrates how to do a resumable upload to Google Drive.Chilkat Lua Downloads
local chilkat = require("chilkat")
-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
local success = true
-- This example uses a previously obtained access token having permission for the
-- Google Drive scope.
-- See Get Google Drive OAuth2 Access Token
local http = chilkat.Http.new()
http.auth_token = "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"
-- }
http:set_request_header("X-Upload-Content-Type", "application/zip")
http:set_request_header("X-Upload-Content-Length", "1366807")
local json = chilkat.JsonObject.new()
json:update_string("name", "myZip")
local resp = chilkat.HttpResponse.new()
success = http:http_json("POST", "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable", json, "application/json", resp)
if not success then
print(http.last_error_text)
return
end
local statusCode = resp.status_code
if statusCode ~= 200 then
print(resp.body_str)
print("response status = " .. statusCode)
return
end
-- The session URI is in the "Location" response header:
local sbSessionUri = chilkat.StringBuilder.new()
sbSessionUri:append(resp:get_header_field("Location"))
local sessionUri = sbSessionUri:get_as_string()
print("Session URI: " .. sessionUri)
-- 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.
http:clear_headers()
-- 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.
local req = chilkat.HttpRequest.new()
req.content_type = "application/zip"
req.http_verb = "PUT"
local url = chilkat.Url.new()
url:parse_url(sessionUri)
req.path = url.path_with_query_params
print("Path with Query Param: " .. url.path_with_query_params)
-- Specify that the request body is to be streamed directly from a file.
success = req:stream_body_from_file("qa_data/zips/big.zip")
if not success then
print(req.last_error_text)
return
end
success = http:http_sreq(url.host, url.port, url.ssl, req, resp)
if not success then
print(http.last_error_text)
return
end
print(resp.body_str)
print("response status = " .. resp.status_code)
-- Sample output:
-- {
-- "kind": "drive#file",
-- "id": "1rx20i53eurtkVQ-RT7Ry8Ct85PgPYMET",
-- "name": "myZip",
-- "mimeType": "application/zip"
-- }
--
-- response status = 200