Sample code for 30+ languages & platforms
SQL Server

Wasabi File Streaming Upload

See more Wasabi Examples

Demonstrates how to do a streaming upload from a file to the Wasabi storage service. The AWS authorization presents some difficulties when the REST request body is to be streamed from a file (or from some other source). The issue is that the SHA-256 hash of the file data must be calculated. There are only two possible ways to do this: (1) stream the file into memory in its entirety and calculate the SHA-256 hash prior to uploading, or (2) pre-calculate the SHA-256 in a streaming fashion, and then provide it to the AWS authentication object.

If the application does NOT pre-compute the SHA-256, then Chilkat (internally) is forced to stream into memory, calculate the SHA-256, and then upload from the in-memory copy of the file.

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
    -- 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.

    -- This first part is optional.  AWS authentication requires
    -- the SHA-256 hash of the request body (i.e. the contents of the file
    -- to be uploaded).  We can choose to pre-calculate the SHA-256 in a streaming fashion
    -- and then provide it to the authenticator object.  This way, if the file is
    -- extremely large, it never needs to completely reside in memory.
    DECLARE @crypt int
    EXEC @hr = sp_OACreate 'Chilkat.Crypt2', @crypt OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    -- ----------------------------------------------------
    -- Important: Wasabi requires a lowercase hex format.
    -- ----------------------------------------------------
    EXEC sp_OASetProperty @crypt, 'EncodingMode', 'hex-lower'
    EXEC sp_OASetProperty @crypt, 'HashAlgorithm', 'sha-256'
    DECLARE @fileToUploadPath nvarchar(4000)
    SELECT @fileToUploadPath = 'qa_data/xml/hamlet.xml'
    DECLARE @hashStr nvarchar(4000)
    EXEC sp_OAMethod @crypt, 'HashFileENC', @hashStr OUT, @fileToUploadPath

    DECLARE @rest int
    EXEC @hr = sp_OACreate 'Chilkat.Rest', @rest OUT

    -- Connect to the Amazon AWS REST server.
    DECLARE @bTls int
    SELECT @bTls = 1
    DECLARE @port int
    SELECT @port = 443
    DECLARE @bAutoReconnect int
    SELECT @bAutoReconnect = 1
    -- This example will demonstrate uploading to a bucket in the eu-west-2 region
    EXEC sp_OAMethod @rest, 'Connect', @success OUT, 's3.eu-west-2.wasabisys.com', @port, @bTls, @bAutoReconnect

    -- Provide AWS credentials for the REST call.
    DECLARE @authAws int
    EXEC @hr = sp_OACreate 'Chilkat.AuthAws', @authAws OUT

    EXEC sp_OASetProperty @authAws, 'AccessKey', 'access-key'
    EXEC sp_OASetProperty @authAws, 'SecretKey', 'secret-key'
    EXEC sp_OASetProperty @authAws, 'ServiceName', 's3'
    -- Provide the pre-computed SHA-256 here:
    EXEC sp_OASetProperty @authAws, 'PrecomputedSha256', @hashStr

    EXEC sp_OAMethod @rest, 'SetAuthAws', @success OUT, @authAws

    EXEC sp_OAMethod @rest, 'AddHeader', @success OUT, 'Expect', '100-continue'
    EXEC sp_OAMethod @rest, 'AddHeader', @success OUT, 'Content-Type', 'application/xml'

    -- Set the bucket name via the HOST header.
    -- In this case, the bucket name is "chilkat100".
    EXEC sp_OASetProperty @rest, 'Host', 'chilkat100.s3.eu-west-2.wasabisys.com'

    DECLARE @fileStream int
    EXEC @hr = sp_OACreate 'Chilkat.Stream', @fileStream OUT

    EXEC sp_OASetProperty @fileStream, 'SourceFile', @fileToUploadPath

    -- Upload to the Wasabi Storage service.
    -- If the application provided the SHA-256 hash of the file contents (as shown above)
    -- then file is streamed and never has to completely reside in memory.
    -- If the application did NOT provide the SHA-256, then Chilkat will (internally) 
    -- load the entire file into memory, calculate the SHA-256, and then upload.
    DECLARE @responseStr nvarchar(4000)
    EXEC sp_OAMethod @rest, 'FullRequestStream', @responseStr OUT, 'PUT', '/hamlet.xml', @fileStream
    EXEC sp_OAGetProperty @rest, 'LastMethodSuccess', @iTmp0 OUT
    IF @iTmp0 <> 1
      BEGIN
        EXEC sp_OAGetProperty @rest, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @rest
        EXEC @hr = sp_OADestroy @authAws
        EXEC @hr = sp_OADestroy @fileStream
        RETURN
      END

    -- When successful, the Wasabi Storage service will respond with a 200 response code,
    -- with an XML body.  
    EXEC sp_OAGetProperty @rest, 'ResponseStatusCode', @iTmp0 OUT
    IF @iTmp0 = 200
      BEGIN

        PRINT @responseStr

        PRINT 'File uploaded.'
      END
    ELSE
      BEGIN
        -- Examine the request/response to see what happened.

        EXEC sp_OAGetProperty @rest, 'ResponseStatusCode', @iTmp0 OUT
        PRINT 'response status code = ' + @iTmp0

        EXEC sp_OAGetProperty @rest, 'ResponseStatusText', @sTmp0 OUT
        PRINT 'response status text = ' + @sTmp0

        EXEC sp_OAGetProperty @rest, 'ResponseHeader', @sTmp0 OUT
        PRINT 'response header: ' + @sTmp0

        PRINT 'response body: ' + @responseStr

        PRINT '---'

        EXEC sp_OAGetProperty @rest, 'LastRequestStartLine', @sTmp0 OUT
        PRINT 'LastRequestStartLine: ' + @sTmp0

        EXEC sp_OAGetProperty @rest, 'LastRequestHeader', @sTmp0 OUT
        PRINT 'LastRequestHeader: ' + @sTmp0
      END

    EXEC @hr = sp_OADestroy @crypt
    EXEC @hr = sp_OADestroy @rest
    EXEC @hr = sp_OADestroy @authAws
    EXEC @hr = sp_OADestroy @fileStream


END
GO