Tcl
Tcl
Frame.io - Upload an Asset
See more Frame.io Examples
Upload an asset to Frame.ioChilkat Tcl Downloads
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