Objective-C
Objective-C
Frame.io - Upload an Asset
See more Frame.io Examples
Upload an asset to Frame.ioChilkat Objective-C Downloads
#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.");