Sample code for 30+ languages & platforms
Objective-C

Frame.io - Upload an Asset

See more Frame.io Examples

Upload an asset to Frame.io

Chilkat Objective-C Downloads

Objective-C
#import <CkoHttp.h>
#import <NSString.h>
#import <CkoFileAccess.h>
#import <CkoJsonObject.h>
#import <CkoHttpResponse.h>
#import <CkoStringBuilder.h>
#import <CkoBinData.h>

BOOL success = NO;

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

CkoHttp *http = [[CkoHttp alloc] init];

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

NSString *localFilePath = @"qa_data/mp4/rotating_earth.mp4";
CkoFileAccess *fac = [[CkoFileAccess alloc] init];
int fileSize = [[fac FileSize: localFilePath] intValue];

CkoJsonObject *json = [[CkoJsonObject alloc] init];
[json UpdateInt: @"filesize" value: [NSNumber numberWithInt: fileSize]];
[json UpdateString: @"filetype" value: @"video/mp4"];
[json UpdateString: @"name" value: @"rotating_earth7"];
[json UpdateString: @"type" value: @"file"];

[http SetRequestHeader: @"content-type" value: @"application/json"];
// Adds the "Authorization: Bearer <FRAME_IO_DEV_TOKEN>" header.
http.AuthToken = @"<FRAME_IO_DEV_TOKEN>";

// Uploading to asset ID: 039845e8-bffe-4d6b-88d3-c780bae06342
CkoHttpResponse *resp = [[CkoHttpResponse alloc] init];
success = [http HttpJson: @"POST" url: @"https://api.frame.io/v2/assets/039845e8-bffe-4d6b-88d3-c780bae06342/children" json: json contentType: @"application/json" response: resp];
if (success == NO) {
    NSLog(@"%@",http.LastErrorText);
    return;
}

CkoStringBuilder *sbResponseBody = [[CkoStringBuilder alloc] init];
[resp GetBodySb: sbResponseBody];
CkoJsonObject *jResp = [[CkoJsonObject alloc] init];
[jResp LoadSb: sbResponseBody];
jResp.EmitCompact = NO;

NSLog(@"%@",@"Response Body:");
NSLog(@"%@",[jResp Emit]);

int respStatusCode = [resp.StatusCode intValue];
NSLog(@"%@%d",@"Response Status Code = ",respStatusCode);
if (respStatusCode >= 400) {
    NSLog(@"%@",@"Response Header:");
    NSLog(@"%@",resp.Header);
    NSLog(@"%@",@"Failed.");
    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.
int numChunks = [[jResp SizeOfArray: @"upload_urls"] intValue];
int sizePerChunk = (fileSize + numChunks - 1) / numChunks;

NSLog(@"%@%d",@"numChunks = ",numChunks);
NSLog(@"%@%d",@"sizePerChunk = ",sizePerChunk);

success = [fac OpenForRead: localFilePath];
if (success == NO) {
    NSLog(@"%@",fac.LastErrorText);
    return;
}

CkoBinData *bd = [[CkoBinData alloc] init];
CkoHttp *httpForUpload = [[CkoHttp alloc] init];

[httpForUpload SetRequestHeader: @"x-amz-acl" value: @"private"];

int i = 0;
while ((i < numChunks)) {
    [bd Clear];
    success = [fac ReadBlockBd: [NSNumber numberWithInt: i] blockSize: [NSNumber numberWithInt: sizePerChunk] bd: bd];

    jResp.I = [NSNumber numberWithInt: i];
    NSString *uploadUrl = [jResp StringOf: @"upload_urls[i]"];

    // Send the chunk in a PUT:

    NSLog(@"%@%d",@"PUT chunk ",i + 1);
    NSLog(@"%@%@",@"URL: ",uploadUrl);

    // PUT https://frameio-uploads-production.s3/etc/etc
    // Content-Type: video/mp4
    // x-amz-acl: private
    success = [httpForUpload HttpBd: @"PUT" url: uploadUrl bd: bd contentType: @"video/mp4" response: resp];
    if (success == NO) {
        NSLog(@"%@",httpForUpload.LastErrorText);
        return;
    }

    NSLog(@"%@%d",@"response status: ",[resp.StatusCode intValue]);

    i = i + 1;
}

[fac FileClose];

NSLog(@"%@",@"File uploaded.");