Sample code for 30+ languages & platforms
PureBasic

S3 Upload String using AWS Signature Version 2

See more Amazon S3 (new) Examples

Example to upload the contents of a string to the Amazon S3 service, using the older AWS Signature Version 2.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkAuthAws.pb"
IncludeFile "CkRest.pb"
IncludeFile "CkFileAccess.pb"

Procedure ChilkatExample()

    success.i = 0

    ; Demonstrates how to use older AWS S3 Signature Version 2 for uploading the contents
    ; of a string variable to an object in a bucket.

    ; This example requires the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    rest.i = CkRest::ckCreate()
    If rest.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Connect to the Amazon AWS REST server.
    bTls.i = 1
    port.i = 443
    bAutoReconnect.i = 1
    ; The file is uploaded to the bucket named "chilkat100", which becomes part of the domain:
    success = CkRest::ckConnect(rest,"chilkat100.s3.amazonaws.com",port,bTls,bAutoReconnect)

    ; ----------------------------------------------------------------------------
    ; Important: For buckets created in regions outside us-east-1,
    ; there are three important changes that need to be made.
    ; See Working with S3 Buckets in Non-us-east-1 Regions for the details.
    ; ----------------------------------------------------------------------------

    ; Provide AWS credentials for the REST call.
    authAws.i = CkAuthAws::ckCreate()
    If authAws.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkAuthAws::setCkAccessKey(authAws, "AWS_ACCESS_KEY")
    CkAuthAws::setCkSecretKey(authAws, "AWS_SECRET_KEY")
    CkAuthAws::setCkServiceName(authAws, "s3")

    ; For AWS Signature Version 2, the following two properties need to be set:
    CkAuthAws::setCkSignatureVersion(authAws, 2)
    ; See http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#ConstructingTheCanonicalizedResourceElement
    ; The bucket is "chilkat100", and the uriPath is "/hamlet_play.xml", which must match
    ; the URI path passed to the FullRequestString method below.
    CkAuthAws::setCkCanonicalizedResourceV2(authAws, "/chilkat100/hamlet_play.xml")

    success = CkRest::ckSetAuthAws(rest,authAws)

    ; Load a text file into memory.
    fac.i = CkFileAccess::ckCreate()
    If fac.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    fileContents.s = CkFileAccess::ckReadEntireTextFile(fac,"qa_data/xml/hamlet.xml","utf-8")
    If CkFileAccess::ckLastMethodSuccess(fac) <> 1
        Debug CkFileAccess::ckLastErrorText(fac)
        CkRest::ckDispose(rest)
        CkAuthAws::ckDispose(authAws)
        CkFileAccess::ckDispose(fac)
        ProcedureReturn
    EndIf

    ; To send the file in gzip or deflate compressed format, set the Content-Encoding request
    ; header to "gzip" or "deflate".  (this is optional)
    success = CkRest::ckAddHeader(rest,"Content-Encoding","gzip")

    ; Indicate the Content-Type of our upload.  (This is optional)
    success = CkRest::ckAddHeader(rest,"Content-Type","text/xml")

    ; We can add an "Expect: 100-continue" header so that if the request is rejected
    ; by the server immediately after receiving the request header, it can respond
    ; and the client (Chilkat) can avoid sending the file data.
    ; (this is optional)
    success = CkRest::ckAddHeader(rest,"Expect","100-continue")

    ; Upload the file to Amazon S3.
    responseBodyStr.s = CkRest::ckFullRequestString(rest,"PUT","/hamlet_play.xml",fileContents)
    If CkRest::ckLastMethodSuccess(rest) <> 1
        Debug CkRest::ckLastErrorText(rest)
        CkRest::ckDispose(rest)
        CkAuthAws::ckDispose(authAws)
        CkFileAccess::ckDispose(fac)
        ProcedureReturn
    EndIf

    ; Did we get a 200 response indicating success?
    statusCode.i = CkRest::ckResponseStatusCode(rest)
    If statusCode <> 200
        Debug "Error response: " + responseBodyStr
        Debug "Status code: " + Str(statusCode) + ", Status text: " + CkRest::ckResponseStatusText(rest)
        CkRest::ckDispose(rest)
        CkAuthAws::ckDispose(authAws)
        CkFileAccess::ckDispose(fac)
        ProcedureReturn
    EndIf

    Debug "File successfully uploaded."


    CkRest::ckDispose(rest)
    CkAuthAws::ckDispose(authAws)
    CkFileAccess::ckDispose(fac)


    ProcedureReturn
EndProcedure