Sample code for 30+ languages & platforms
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

SQL Server
-- 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