C
C
Frame.io - Upload an Asset
See more Frame.io Examples
Upload an asset to Frame.ioChilkat C Downloads
#include <C_CkHttp.h>
#include <C_CkFileAccess.h>
#include <C_CkJsonObject.h>
#include <C_CkHttpResponse.h>
#include <C_CkStringBuilder.h>
#include <C_CkBinData.h>
void ChilkatSample(void)
{
BOOL success;
HCkHttp http;
const char *localFilePath;
HCkFileAccess fac;
int fileSize;
HCkJsonObject json;
HCkHttpResponse resp;
HCkStringBuilder sbResponseBody;
HCkJsonObject jResp;
int respStatusCode;
int numChunks;
int sizePerChunk;
HCkBinData bd;
HCkHttp httpForUpload;
int i;
const char *uploadUrl;
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) {
printf("%s\n",CkHttp_lastErrorText(http));
CkHttp_Dispose(http);
CkFileAccess_Dispose(fac);
CkJsonObject_Dispose(json);
CkHttpResponse_Dispose(resp);
return;
}
sbResponseBody = CkStringBuilder_Create();
CkHttpResponse_GetBodySb(resp,sbResponseBody);
jResp = CkJsonObject_Create();
CkJsonObject_LoadSb(jResp,sbResponseBody);
CkJsonObject_putEmitCompact(jResp,FALSE);
printf("Response Body:\n");
printf("%s\n",CkJsonObject_emit(jResp));
respStatusCode = CkHttpResponse_getStatusCode(resp);
printf("Response Status Code = %d\n",respStatusCode);
if (respStatusCode >= 400) {
printf("Response Header:\n");
printf("%s\n",CkHttpResponse_header(resp));
printf("Failed.\n");
CkHttp_Dispose(http);
CkFileAccess_Dispose(fac);
CkJsonObject_Dispose(json);
CkHttpResponse_Dispose(resp);
CkStringBuilder_Dispose(sbResponseBody);
CkJsonObject_Dispose(jResp);
return;
}
// 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;
printf("numChunks = %d\n",numChunks);
printf("sizePerChunk = %d\n",sizePerChunk);
success = CkFileAccess_OpenForRead(fac,localFilePath);
if (success == FALSE) {
printf("%s\n",CkFileAccess_lastErrorText(fac));
CkHttp_Dispose(http);
CkFileAccess_Dispose(fac);
CkJsonObject_Dispose(json);
CkHttpResponse_Dispose(resp);
CkStringBuilder_Dispose(sbResponseBody);
CkJsonObject_Dispose(jResp);
return;
}
bd = CkBinData_Create();
httpForUpload = CkHttp_Create();
CkHttp_SetRequestHeader(httpForUpload,"x-amz-acl","private");
i = 0;
while ((i < numChunks)) {
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:
printf("PUT chunk %d\n",i + 1);
printf("URL: %s\n",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) {
printf("%s\n",CkHttp_lastErrorText(httpForUpload));
CkHttp_Dispose(http);
CkFileAccess_Dispose(fac);
CkJsonObject_Dispose(json);
CkHttpResponse_Dispose(resp);
CkStringBuilder_Dispose(sbResponseBody);
CkJsonObject_Dispose(jResp);
CkBinData_Dispose(bd);
CkHttp_Dispose(httpForUpload);
return;
}
printf("response status: %d\n",CkHttpResponse_getStatusCode(resp));
i = i + 1;
}
CkFileAccess_FileClose(fac);
printf("File uploaded.\n");
CkHttp_Dispose(http);
CkFileAccess_Dispose(fac);
CkJsonObject_Dispose(json);
CkHttpResponse_Dispose(resp);
CkStringBuilder_Dispose(sbResponseBody);
CkJsonObject_Dispose(jResp);
CkBinData_Dispose(bd);
CkHttp_Dispose(httpForUpload);
}