DataFlex
DataFlex
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 DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoCrypt
String sFileToUploadPath
String sHashStr
Handle hoRest
Boolean iBTls
Integer iPort
Boolean iBAutoReconnect
Variant vAuthAws
Handle hoAuthAws
Variant vFileStream
Handle hoFileStream
String sResponseStr
String sTemp1
Integer iTemp1
Boolean bTemp1
Move False To iSuccess
// 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.
Get Create (RefClass(cComChilkatCrypt2)) To hoCrypt
If (Not(IsComObjectCreated(hoCrypt))) Begin
Send CreateComObject of hoCrypt
End
// ----------------------------------------------------
// Important: Wasabi requires a lowercase hex format.
// ----------------------------------------------------
Set ComEncodingMode Of hoCrypt To "hex-lower"
Set ComHashAlgorithm Of hoCrypt To "sha-256"
Move "qa_data/xml/hamlet.xml" To sFileToUploadPath
Get ComHashFileENC Of hoCrypt sFileToUploadPath To sHashStr
Get Create (RefClass(cComChilkatRest)) To hoRest
If (Not(IsComObjectCreated(hoRest))) Begin
Send CreateComObject of hoRest
End
// Connect to the Amazon AWS REST server.
Move True To iBTls
Move 443 To iPort
Move True To iBAutoReconnect
// This example will demonstrate uploading to a bucket in the eu-west-2 region
Get ComConnect Of hoRest "s3.eu-west-2.wasabisys.com" iPort iBTls iBAutoReconnect To iSuccess
// Provide AWS credentials for the REST call.
Get Create (RefClass(cComChilkatAuthAws)) To hoAuthAws
If (Not(IsComObjectCreated(hoAuthAws))) Begin
Send CreateComObject of hoAuthAws
End
Set ComAccessKey Of hoAuthAws To "access-key"
Set ComSecretKey Of hoAuthAws To "secret-key"
Set ComServiceName Of hoAuthAws To "s3"
// Provide the pre-computed SHA-256 here:
Set ComPrecomputedSha256 Of hoAuthAws To sHashStr
Get pvComObject of hoAuthAws to vAuthAws
Get ComSetAuthAws Of hoRest vAuthAws To iSuccess
Get ComAddHeader Of hoRest "Expect" "100-continue" To iSuccess
Get ComAddHeader Of hoRest "Content-Type" "application/xml" To iSuccess
// Set the bucket name via the HOST header.
// In this case, the bucket name is "chilkat100".
Set ComHost Of hoRest To "chilkat100.s3.eu-west-2.wasabisys.com"
Get Create (RefClass(cComChilkatStream)) To hoFileStream
If (Not(IsComObjectCreated(hoFileStream))) Begin
Send CreateComObject of hoFileStream
End
Set ComSourceFile Of hoFileStream To sFileToUploadPath
// 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.
Get pvComObject of hoFileStream to vFileStream
Get ComFullRequestStream Of hoRest "PUT" "/hamlet.xml" vFileStream To sResponseStr
Get ComLastMethodSuccess Of hoRest To bTemp1
If (bTemp1 <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
// When successful, the Wasabi Storage service will respond with a 200 response code,
// with an XML body.
Get ComResponseStatusCode Of hoRest To iTemp1
If (iTemp1 = 200) Begin
Showln sResponseStr
Showln "File uploaded."
End
Else Begin
// Examine the request/response to see what happened.
Get ComResponseStatusCode Of hoRest To iTemp1
Showln "response status code = " iTemp1
Get ComResponseStatusText Of hoRest To sTemp1
Showln "response status text = " sTemp1
Get ComResponseHeader Of hoRest To sTemp1
Showln "response header: " sTemp1
Showln "response body: " sResponseStr
Showln "---"
Get ComLastRequestStartLine Of hoRest To sTemp1
Showln "LastRequestStartLine: " sTemp1
Get ComLastRequestHeader Of hoRest To sTemp1
Showln "LastRequestHeader: " sTemp1
End
End_Procedure