Sample code for 30+ languages & platforms
Visual FoxPro

Frame.io - Upload an Asset

See more Frame.io Examples

Upload an asset to Frame.io

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loHttp
LOCAL lcLocalFilePath
LOCAL loFac
LOCAL lnFileSize
LOCAL loJson
LOCAL loResp
LOCAL loSbResponseBody
LOCAL loJResp
LOCAL lnRespStatusCode
LOCAL lnNumChunks
LOCAL lnSizePerChunk
LOCAL loBd
LOCAL loHttpForUpload
LOCAL i
LOCAL lcUploadUrl

lnSuccess = 0

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

loHttp = CreateObject('Chilkat.Http')

* 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"
* }

lcLocalFilePath = "qa_data/mp4/rotating_earth.mp4"
loFac = CreateObject('Chilkat.FileAccess')
lnFileSize = loFac.FileSize(lcLocalFilePath)

loJson = CreateObject('Chilkat.JsonObject')
loJson.UpdateInt("filesize",lnFileSize)
loJson.UpdateString("filetype","video/mp4")
loJson.UpdateString("name","rotating_earth7")
loJson.UpdateString("type","file")

loHttp.SetRequestHeader("content-type","application/json")
* Adds the "Authorization: Bearer <FRAME_IO_DEV_TOKEN>" header.
loHttp.AuthToken = "<FRAME_IO_DEV_TOKEN>"

* Uploading to asset ID: 039845e8-bffe-4d6b-88d3-c780bae06342
loResp = CreateObject('Chilkat.HttpResponse')
lnSuccess = loHttp.HttpJson("POST","https://api.frame.io/v2/assets/039845e8-bffe-4d6b-88d3-c780bae06342/children",loJson,"application/json",loResp)
IF (lnSuccess = 0) THEN
    ? loHttp.LastErrorText
    RELEASE loHttp
    RELEASE loFac
    RELEASE loJson
    RELEASE loResp
    CANCEL
ENDIF

loSbResponseBody = CreateObject('Chilkat.StringBuilder')
loResp.GetBodySb(loSbResponseBody)
loJResp = CreateObject('Chilkat.JsonObject')
loJResp.LoadSb(loSbResponseBody)
loJResp.EmitCompact = 0

? "Response Body:"
? loJResp.Emit()

lnRespStatusCode = loResp.StatusCode
? "Response Status Code = " + STR(lnRespStatusCode)
IF (lnRespStatusCode >= 400) THEN
    ? "Response Header:"
    ? loResp.Header
    ? "Failed."
    RELEASE loHttp
    RELEASE loFac
    RELEASE loJson
    RELEASE loResp
    RELEASE loSbResponseBody
    RELEASE loJResp
    CANCEL
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.
lnNumChunks = loJResp.SizeOfArray("upload_urls")
lnSizePerChunk = (lnFileSize + lnNumChunks - 1) / lnNumChunks

? "numChunks = " + STR(lnNumChunks)
? "sizePerChunk = " + STR(lnSizePerChunk)

lnSuccess = loFac.OpenForRead(lcLocalFilePath)
IF (lnSuccess = 0) THEN
    ? loFac.LastErrorText
    RELEASE loHttp
    RELEASE loFac
    RELEASE loJson
    RELEASE loResp
    RELEASE loSbResponseBody
    RELEASE loJResp
    CANCEL
ENDIF

loBd = CreateObject('Chilkat.BinData')
loHttpForUpload = CreateObject('Chilkat.Http')

loHttpForUpload.SetRequestHeader("x-amz-acl","private")

i = 0
DO WHILE (i < lnNumChunks)
    loBd.Clear()
    lnSuccess = loFac.ReadBlockBd(i,lnSizePerChunk,loBd)

    loJResp.I = i
    lcUploadUrl = loJResp.StringOf("upload_urls[i]")

    * Send the chunk in a PUT:

    ? "PUT chunk " + STR(i + 1)
    ? "URL: " + lcUploadUrl

    * PUT https://frameio-uploads-production.s3/etc/etc
    * Content-Type: video/mp4
    * x-amz-acl: private
    lnSuccess = loHttpForUpload.HttpBd("PUT",lcUploadUrl,loBd,"video/mp4",loResp)
    IF (lnSuccess = 0) THEN
        ? loHttpForUpload.LastErrorText
        RELEASE loHttp
        RELEASE loFac
        RELEASE loJson
        RELEASE loResp
        RELEASE loSbResponseBody
        RELEASE loJResp
        RELEASE loBd
        RELEASE loHttpForUpload
        CANCEL
    ENDIF

    ? "response status: " + STR(loResp.StatusCode)

    i = i + 1
ENDDO

loFac.FileClose()

? "File uploaded."

RELEASE loHttp
RELEASE loFac
RELEASE loJson
RELEASE loResp
RELEASE loSbResponseBody
RELEASE loJResp
RELEASE loBd
RELEASE loHttpForUpload