Sample code for 30+ languages & platforms
Tcl

Use an Azure Service SAS

See more Azure Cloud Storage Examples

Shows how to use an Azure Service SAS. (In this case, it is an SAS for a blob.)

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

# Azure Blob Service Example: Upload binary bytes to a block blob.
# This uses a Service SAS for Authorization.

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

set rest [new_CkRest]

# Connect to the Azure Storage Blob Service
set bTls 1
set port 443
set bAutoReconnect 1
# In this example, the storage account name is "chilkat".
set success [CkRest_Connect $rest "chilkat.blob.core.windows.net" $port $bTls $bAutoReconnect]
if {$success != 1} then {
    puts [CkRest_lastErrorText $rest]
    delete_CkRest $rest
    exit
}

# ----------------------------------------------------------------------------------------------
# The code above this comment could be placed inside a function/subroutine within the application
# because the connection does not need to be made for every request.  Once the connection is made
# the app may send many requests..
# ----------------------------------------------------------------------------------------------

# Note: The application does not need to explicitly set the following
# headers: Content-Length, x-ms-date, Authorization.  These headers
# are automatically set by Chilkat.

# Let's load a previously computed Azure Storage Account SAS token and use it.
# See How to Create an Azure Service SAS
set sbToken [new_CkStringBuilder]

set success [CkStringBuilder_LoadFile $sbToken "qa_data/tokens/azureStorageServiceSas.txt" "utf-8"]
if {$success != 1} then {
    puts "Failed to load SAS token."
    delete_CkRest $rest
    delete_CkStringBuilder $sbToken
    exit
}

# Add the Shared Access Signature query params for authorization.
CkRest_AddQueryParams $rest [CkStringBuilder_getAsString $sbToken]

# IMPORTANT: Make sure to set the x-ms-blob-type header:
set success [CkRest_AddHeader $rest "x-ms-blob-type" "BlockBlob"]

# IMPORTANT: Make sure to add the x-ms-date header.
# When the header name is "x-ms-date", Chilkat will recognize the keyword "NOW" 
# and will substitute the current system date/time formatted as required by Microsoft.
set success [CkRest_AddHeader $rest "x-ms-date" "NOW"]

# For this example, we'll just load a JPG file into memory..
set binData [new_CkBinData]

set success [CkBinData_LoadFile $binData "qa_data/jpg/starfish.jpg"]
if {$success != 1} then {
    puts "Failed to load JPG file."
    delete_CkRest $rest
    delete_CkStringBuilder $sbToken
    delete_CkBinData $binData
    exit
}

# Note: The maximum size of a block blob created by uploading in a single step is 64MB.  
# For larger files, the upload must be broken up into blocks.  There is another Chilkat example for that..
set sbResponse [new_CkStringBuilder]

set success [CkRest_FullRequestBd $rest "PUT" "/mycontainer/starfish.jpg" $binData $sbResponse]
if {$success != 1} then {
    puts [CkRest_lastErrorText $rest]
    delete_CkRest $rest
    delete_CkStringBuilder $sbToken
    delete_CkBinData $binData
    delete_CkStringBuilder $sbResponse
    exit
}

# When successful, the Azure Storage service will respond with a 201 response status code,
# with no response body.
if {[CkRest_get_ResponseStatusCode $rest] != 201} then {
    # Examine the request/response to see what happened.
    puts "response status code = [CkRest_get_ResponseStatusCode $rest]"
    puts "response status text = [CkRest_responseStatusText $rest]"
    puts "response header: [CkRest_responseHeader $rest]"
    puts "response body (if any): [CkStringBuilder_getAsString $sbResponse]"
    puts "---"
    puts "LastRequestStartLine: [CkRest_lastRequestStartLine $rest]"
    puts "LastRequestHeader: [CkRest_lastRequestHeader $rest]"
    puts "Failed."
    delete_CkRest $rest
    delete_CkStringBuilder $sbToken
    delete_CkBinData $binData
    delete_CkStringBuilder $sbResponse
    exit
}

puts "Success."

delete_CkRest $rest
delete_CkStringBuilder $sbToken
delete_CkBinData $binData
delete_CkStringBuilder $sbResponse