SQL Server
SQL Server
Google Drive - Resumable Upload
See more Google Drive Examples
Demonstrates how to do a resumable upload to Google Drive.Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
DECLARE @iTmp1 int
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
SELECT @success = 1
-- This example uses a previously obtained access token having permission for the
-- Google Drive scope.
-- See Get Google Drive OAuth2 Access Token
DECLARE @http int
EXEC @hr = sp_OACreate 'Chilkat.Http', @http OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
EXEC sp_OASetProperty @http, 'AuthToken', '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"
-- }
EXEC sp_OAMethod @http, 'SetRequestHeader', NULL, 'X-Upload-Content-Type', 'application/zip'
EXEC sp_OAMethod @http, 'SetRequestHeader', NULL, 'X-Upload-Content-Length', '1366807'
DECLARE @json int
EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @json OUT
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'name', 'myZip'
DECLARE @resp int
EXEC @hr = sp_OACreate 'Chilkat.HttpResponse', @resp OUT
EXEC sp_OAMethod @http, 'HttpJson', @success OUT, 'POST', 'https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable', @json, 'application/json', @resp
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @http, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @resp
RETURN
END
DECLARE @statusCode int
EXEC sp_OAGetProperty @resp, 'StatusCode', @statusCode OUT
IF @statusCode <> 200
BEGIN
EXEC sp_OAGetProperty @resp, 'BodyStr', @sTmp0 OUT
PRINT @sTmp0
PRINT 'response status = ' + @statusCode
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @resp
RETURN
END
-- The session URI is in the "Location" response header:
DECLARE @sbSessionUri int
EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbSessionUri OUT
EXEC sp_OAMethod @resp, 'GetHeaderField', @sTmp0 OUT, 'Location'
EXEC sp_OAMethod @sbSessionUri, 'Append', @success OUT, @sTmp0
DECLARE @sessionUri nvarchar(4000)
EXEC sp_OAMethod @sbSessionUri, 'GetAsString', @sessionUri OUT
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.
EXEC sp_OAMethod @http, 'ClearHeaders', NULL
-- 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.
DECLARE @req int
EXEC @hr = sp_OACreate 'Chilkat.HttpRequest', @req OUT
EXEC sp_OASetProperty @req, 'ContentType', 'application/zip'
EXEC sp_OASetProperty @req, 'HttpVerb', 'PUT'
DECLARE @url int
EXEC @hr = sp_OACreate 'Chilkat.Url', @url OUT
EXEC sp_OAMethod @url, 'ParseUrl', @success OUT, @sessionUri
EXEC sp_OAGetProperty @url, 'PathWithQueryParams', @sTmp0 OUT
EXEC sp_OASetProperty @req, 'Path', @sTmp0
EXEC sp_OAGetProperty @url, 'PathWithQueryParams', @sTmp0 OUT
PRINT 'Path with Query Param: ' + @sTmp0
-- Specify that the request body is to be streamed directly from a file.
EXEC sp_OAMethod @req, 'StreamBodyFromFile', @success OUT, 'qa_data/zips/big.zip'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @req, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @resp
EXEC @hr = sp_OADestroy @sbSessionUri
EXEC @hr = sp_OADestroy @req
EXEC @hr = sp_OADestroy @url
RETURN
END
EXEC sp_OAGetProperty @url, 'Host', @sTmp0 OUT
EXEC sp_OAGetProperty @url, 'Port', @iTmp0 OUT
EXEC sp_OAGetProperty @url, 'Ssl', @iTmp1 OUT
EXEC sp_OAMethod @http, 'HttpSReq', @success OUT, @sTmp0, @iTmp0, @iTmp1, @req, @resp
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @http, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @resp
EXEC @hr = sp_OADestroy @sbSessionUri
EXEC @hr = sp_OADestroy @req
EXEC @hr = sp_OADestroy @url
RETURN
END
EXEC sp_OAGetProperty @resp, 'BodyStr', @sTmp0 OUT
PRINT @sTmp0
EXEC sp_OAGetProperty @resp, 'StatusCode', @iTmp0 OUT
PRINT 'response status = ' + @iTmp0
-- Sample output:
-- {
-- "kind": "drive#file",
-- "id": "1rx20i53eurtkVQ-RT7Ry8Ct85PgPYMET",
-- "name": "myZip",
-- "mimeType": "application/zip"
-- }
--
-- response status = 200
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @resp
EXEC @hr = sp_OADestroy @sbSessionUri
EXEC @hr = sp_OADestroy @req
EXEC @hr = sp_OADestroy @url
END
GO