PureBasic
PureBasic
Frame.io - Upload an Asset
See more Frame.io Examples
Upload an asset to Frame.ioChilkat PureBasic Downloads
IncludeFile "CkJsonObject.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkFileAccess.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkHttpResponse.pb"
IncludeFile "CkBinData.pb"
Procedure ChilkatExample()
success.i = 0
; This example assumes the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
http.i = CkHttp::ckCreate()
If http.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; 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"
; }
localFilePath.s = "qa_data/mp4/rotating_earth.mp4"
fac.i = CkFileAccess::ckCreate()
If fac.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
fileSize.i = CkFileAccess::ckFileSize(fac,localFilePath)
json.i = CkJsonObject::ckCreate()
If json.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkJsonObject::ckUpdateInt(json,"filesize",fileSize)
CkJsonObject::ckUpdateString(json,"filetype","video/mp4")
CkJsonObject::ckUpdateString(json,"name","rotating_earth7")
CkJsonObject::ckUpdateString(json,"type","file")
CkHttp::ckSetRequestHeader(http,"content-type","application/json")
; Adds the "Authorization: Bearer <FRAME_IO_DEV_TOKEN>" header.
CkHttp::setCkAuthToken(http, "<FRAME_IO_DEV_TOKEN>")
; Uploading to asset ID: 039845e8-bffe-4d6b-88d3-c780bae06342
resp.i = CkHttpResponse::ckCreate()
If resp.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkHttp::ckHttpJson(http,"POST","https://api.frame.io/v2/assets/039845e8-bffe-4d6b-88d3-c780bae06342/children",json,"application/json",resp)
If success = 0
Debug CkHttp::ckLastErrorText(http)
CkHttp::ckDispose(http)
CkFileAccess::ckDispose(fac)
CkJsonObject::ckDispose(json)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndIf
sbResponseBody.i = CkStringBuilder::ckCreate()
If sbResponseBody.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkHttpResponse::ckGetBodySb(resp,sbResponseBody)
jResp.i = CkJsonObject::ckCreate()
If jResp.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkJsonObject::ckLoadSb(jResp,sbResponseBody)
CkJsonObject::setCkEmitCompact(jResp, 0)
Debug "Response Body:"
Debug CkJsonObject::ckEmit(jResp)
respStatusCode.i = CkHttpResponse::ckStatusCode(resp)
Debug "Response Status Code = " + Str(respStatusCode)
If respStatusCode >= 400
Debug "Response Header:"
Debug CkHttpResponse::ckHeader(resp)
Debug "Failed."
CkHttp::ckDispose(http)
CkFileAccess::ckDispose(fac)
CkJsonObject::ckDispose(json)
CkHttpResponse::ckDispose(resp)
CkStringBuilder::ckDispose(sbResponseBody)
CkJsonObject::ckDispose(jResp)
ProcedureReturn
EndIf
; 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.
numChunks.i = CkJsonObject::ckSizeOfArray(jResp,"upload_urls")
sizePerChunk.i = (fileSize + numChunks - 1) / numChunks
Debug "numChunks = " + Str(numChunks)
Debug "sizePerChunk = " + Str(sizePerChunk)
success = CkFileAccess::ckOpenForRead(fac,localFilePath)
If success = 0
Debug CkFileAccess::ckLastErrorText(fac)
CkHttp::ckDispose(http)
CkFileAccess::ckDispose(fac)
CkJsonObject::ckDispose(json)
CkHttpResponse::ckDispose(resp)
CkStringBuilder::ckDispose(sbResponseBody)
CkJsonObject::ckDispose(jResp)
ProcedureReturn
EndIf
bd.i = CkBinData::ckCreate()
If bd.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
httpForUpload.i = CkHttp::ckCreate()
If httpForUpload.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkHttp::ckSetRequestHeader(httpForUpload,"x-amz-acl","private")
i.i = 0
While (i < numChunks)
CkBinData::ckClear(bd)
success = CkFileAccess::ckReadBlockBd(fac,i,sizePerChunk,bd)
CkJsonObject::setCkI(jResp, i)
uploadUrl.s = CkJsonObject::ckStringOf(jResp,"upload_urls[i]")
; Send the chunk in a PUT:
Debug "PUT chunk " + Str(i + 1)
Debug "URL: " + uploadUrl
; PUT https://frameio-uploads-production.s3/etc/etc
; Content-Type: video/mp4
; x-amz-acl: private
success = CkHttp::ckHttpBd(httpForUpload,"PUT",uploadUrl,bd,"video/mp4",resp)
If success = 0
Debug CkHttp::ckLastErrorText(httpForUpload)
CkHttp::ckDispose(http)
CkFileAccess::ckDispose(fac)
CkJsonObject::ckDispose(json)
CkHttpResponse::ckDispose(resp)
CkStringBuilder::ckDispose(sbResponseBody)
CkJsonObject::ckDispose(jResp)
CkBinData::ckDispose(bd)
CkHttp::ckDispose(httpForUpload)
ProcedureReturn
EndIf
Debug "response status: " + Str(CkHttpResponse::ckStatusCode(resp))
i = i + 1
Wend
CkFileAccess::ckFileClose(fac)
Debug "File uploaded."
CkHttp::ckDispose(http)
CkFileAccess::ckDispose(fac)
CkJsonObject::ckDispose(json)
CkHttpResponse::ckDispose(resp)
CkStringBuilder::ckDispose(sbResponseBody)
CkJsonObject::ckDispose(jResp)
CkBinData::ckDispose(bd)
CkHttp::ckDispose(httpForUpload)
ProcedureReturn
EndProcedure