Sample code for 30+ languages & platforms
Delphi DLL Requires Chilkat v11.0.0+

Frame.io - Upload an Asset

See more Frame.io Examples

Upload an asset to Frame.io

Chilkat Delphi DLL Downloads

Delphi DLL
var
success: Boolean;
http: HCkHttp;
localFilePath: PWideChar;
fac: HCkFileAccess;
fileSize: Integer;
json: HCkJsonObject;
resp: HCkHttpResponse;
sbResponseBody: HCkStringBuilder;
jResp: HCkJsonObject;
respStatusCode: Integer;
numChunks: Integer;
sizePerChunk: Integer;
bd: HCkBinData;
httpForUpload: HCkHttp;
i: Integer;
uploadUrl: PWideChar;

begin
success := False;

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

http := CkHttp_Create();

//  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 := 'qa_data/mp4/rotating_earth.mp4';
fac := CkFileAccess_Create();
fileSize := CkFileAccess_FileSize(fac,localFilePath);

json := CkJsonObject_Create();
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_putAuthToken(http,'<FRAME_IO_DEV_TOKEN>');

//  Uploading to asset ID: 039845e8-bffe-4d6b-88d3-c780bae06342
resp := CkHttpResponse_Create();
success := CkHttp_HttpJson(http,'POST','https://api.frame.io/v2/assets/039845e8-bffe-4d6b-88d3-c780bae06342/children',json,'application/json',resp);
if (success = False) then
  begin
    Memo1.Lines.Add(CkHttp__lastErrorText(http));
    Exit;
  end;

sbResponseBody := CkStringBuilder_Create();
CkHttpResponse_GetBodySb(resp,sbResponseBody);
jResp := CkJsonObject_Create();
CkJsonObject_LoadSb(jResp,sbResponseBody);
CkJsonObject_putEmitCompact(jResp,False);

Memo1.Lines.Add('Response Body:');
Memo1.Lines.Add(CkJsonObject__emit(jResp));

respStatusCode := CkHttpResponse_getStatusCode(resp);
Memo1.Lines.Add('Response Status Code = ' + IntToStr(respStatusCode));
if (respStatusCode >= 400) then
  begin
    Memo1.Lines.Add('Response Header:');
    Memo1.Lines.Add(CkHttpResponse__header(resp));
    Memo1.Lines.Add('Failed.');
    Exit;
  end;

//  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 := CkJsonObject_SizeOfArray(jResp,'upload_urls');
sizePerChunk := (fileSize + numChunks - 1) / numChunks;

Memo1.Lines.Add('numChunks = ' + IntToStr(numChunks));
Memo1.Lines.Add('sizePerChunk = ' + IntToStr(sizePerChunk));

success := CkFileAccess_OpenForRead(fac,localFilePath);
if (success = False) then
  begin
    Memo1.Lines.Add(CkFileAccess__lastErrorText(fac));
    Exit;
  end;

bd := CkBinData_Create();
httpForUpload := CkHttp_Create();

CkHttp_SetRequestHeader(httpForUpload,'x-amz-acl','private');

i := 0;
while (i < numChunks) do
  begin
    CkBinData_Clear(bd);
    success := CkFileAccess_ReadBlockBd(fac,i,sizePerChunk,bd);

    CkJsonObject_putI(jResp,i);
    uploadUrl := CkJsonObject__stringOf(jResp,'upload_urls[i]');

    //  Send the chunk in a PUT:

    Memo1.Lines.Add('PUT chunk ' + IntToStr(i + 1));
    Memo1.Lines.Add('URL: ' + uploadUrl);

    //  PUT https://frameio-uploads-production.s3/etc/etc
    //  Content-Type: video/mp4
    //  x-amz-acl: private
    success := CkHttp_HttpBd(httpForUpload,'PUT',uploadUrl,bd,'video/mp4',resp);
    if (success = False) then
      begin
        Memo1.Lines.Add(CkHttp__lastErrorText(httpForUpload));
        Exit;
      end;

    Memo1.Lines.Add('response status: ' + IntToStr(CkHttpResponse_getStatusCode(resp)));

    i := i + 1;
  end;

CkFileAccess_FileClose(fac);

Memo1.Lines.Add('File uploaded.');

CkHttp_Dispose(http);
CkFileAccess_Dispose(fac);
CkJsonObject_Dispose(json);
CkHttpResponse_Dispose(resp);
CkStringBuilder_Dispose(sbResponseBody);
CkJsonObject_Dispose(jResp);
CkBinData_Dispose(bd);
CkHttp_Dispose(httpForUpload);