Sample code for 30+ languages & platforms
Tcl

Frame.io - Upload an Asset

See more Frame.io Examples

Upload an asset to Frame.io

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

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

set http [new_CkHttp]

# Implements the following CURL command:

# curl --request POST \
#   --url https://api.frame.io/v2/assets/<ASSET_ID>/children \
#   --header 'authorization: Bearer <FRAME_IO_DEV_TOKEN>' \
#   --header 'content-type: application/json' \
#   --data '{"filesize":1570024 ,"filetype":"video/mp4","name":"rotating_earth","type":"file"}'

# Use the following online tool to generate HTTP code from a CURL command
# Convert a cURL Command to HTTP Source Code

# Use this online tool to generate code from sample JSON:
# Generate Code to Create JSON

# The following JSON is sent in the request body.

# {
#   "filesize": 1570024,
#   "filetype": "video/mp4",
#   "name": "rotating_earth",
#   "type": "file"
# }

set localFilePath "qa_data/mp4/rotating_earth.mp4"
set fac [new_CkFileAccess]

set fileSize [CkFileAccess_FileSize $fac $localFilePath]

set json [new_CkJsonObject]

CkJsonObject_UpdateInt $json "filesize" $fileSize
CkJsonObject_UpdateString $json "filetype" "video/mp4"
CkJsonObject_UpdateString $json "name" "rotating_earth7"
CkJsonObject_UpdateString $json "type" "file"

CkHttp_SetRequestHeader $http "content-type" "application/json"
# Adds the "Authorization: Bearer <FRAME_IO_DEV_TOKEN>" header.
CkHttp_put_AuthToken $http "<FRAME_IO_DEV_TOKEN>"

# Uploading to asset ID: 039845e8-bffe-4d6b-88d3-c780bae06342
set resp [new_CkHttpResponse]

set success [CkHttp_HttpJson $http "POST" "https://api.frame.io/v2/assets/039845e8-bffe-4d6b-88d3-c780bae06342/children" $json "application/json" $resp]
if {$success == 0} then {
    puts [CkHttp_lastErrorText $http]
    delete_CkHttp $http
    delete_CkFileAccess $fac
    delete_CkJsonObject $json
    delete_CkHttpResponse $resp
    exit
}

set sbResponseBody [new_CkStringBuilder]

CkHttpResponse_GetBodySb $resp $sbResponseBody
set jResp [new_CkJsonObject]

CkJsonObject_LoadSb $jResp $sbResponseBody
CkJsonObject_put_EmitCompact $jResp 0

puts "Response Body:"
puts [CkJsonObject_emit $jResp]

set respStatusCode [CkHttpResponse_get_StatusCode $resp]
puts "Response Status Code = $respStatusCode"
if {$respStatusCode >= 400} then {
    puts "Response Header:"
    puts [CkHttpResponse_header $resp]
    puts "Failed."
    delete_CkHttp $http
    delete_CkFileAccess $fac
    delete_CkJsonObject $json
    delete_CkHttpResponse $resp
    delete_CkStringBuilder $sbResponseBody
    delete_CkJsonObject $jResp
    exit
}

# Upload in chunks to the pre-signed S3 upload URLs.
# There are ways to do this in parallel, but for simplicity we'll show how to upload
# one chunk after another.
set numChunks [CkJsonObject_SizeOfArray $jResp "upload_urls"]
set sizePerChunk [expr [expr $fileSize + [expr $numChunks - 1]] / $numChunks]

puts "numChunks = $numChunks"
puts "sizePerChunk = $sizePerChunk"

set success [CkFileAccess_OpenForRead $fac $localFilePath]
if {$success == 0} then {
    puts [CkFileAccess_lastErrorText $fac]
    delete_CkHttp $http
    delete_CkFileAccess $fac
    delete_CkJsonObject $json
    delete_CkHttpResponse $resp
    delete_CkStringBuilder $sbResponseBody
    delete_CkJsonObject $jResp
    exit
}

set bd [new_CkBinData]

set httpForUpload [new_CkHttp]

CkHttp_SetRequestHeader $httpForUpload "x-amz-acl" "private"

set i 0
while {$i < $numChunks} {
    CkBinData_Clear $bd
    set success [CkFileAccess_ReadBlockBd $fac $i $sizePerChunk $bd]

    CkJsonObject_put_I $jResp $i
    set uploadUrl [CkJsonObject_stringOf $jResp "upload_urls[i]"]

    # Send the chunk in a PUT:

    puts "PUT chunk [expr $i + 1]"
    puts "URL: $uploadUrl"

    # PUT https://frameio-uploads-production.s3/etc/etc
    # Content-Type: video/mp4
    # x-amz-acl: private
    set success [CkHttp_HttpBd $httpForUpload "PUT" $uploadUrl $bd "video/mp4" $resp]
    if {$success == 0} then {
        puts [CkHttp_lastErrorText $httpForUpload]
        delete_CkHttp $http
        delete_CkFileAccess $fac
        delete_CkJsonObject $json
        delete_CkHttpResponse $resp
        delete_CkStringBuilder $sbResponseBody
        delete_CkJsonObject $jResp
        delete_CkBinData $bd
        delete_CkHttp $httpForUpload
        exit
    }

    puts "response status: [CkHttpResponse_get_StatusCode $resp]"

    set i [expr $i + 1]
}

CkFileAccess_FileClose $fac

puts "File uploaded."

delete_CkHttp $http
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkHttpResponse $resp
delete_CkStringBuilder $sbResponseBody
delete_CkJsonObject $jResp
delete_CkBinData $bd
delete_CkHttp $httpForUpload