Delphi DLL Requires Chilkat v11.0.0+
Delphi DLL
Frame.io - Upload an Asset
See more Frame.io Examples
Upload an asset to Frame.ioChilkat Delphi DLL Downloads
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);