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