Help Center> Object Storage Service> iOS> Object Download> Performing a Conditioned Download
Updated on 2024-05-08 GMT+08:00

Performing a Conditioned Download

When downloading an object, you can specify one or more conditions. Only when the conditions are met, the object will be downloaded. Otherwise, an exception indicating a download failure will be thrown.

You can set the following conditions:

Parameter

Description

Method in OBS iOS SDK

ifModifiedSince

Returns the object if it has been modified since the specified time; otherwise, an error is returned.

request.ifModifiedSince

ifUnmodifiedSince

Returns the object if it has not been modified since the specified time; otherwise, an error is returned.

request.ifUnmodifiedSince

ifETagMatch

Returns the source object if its ETag is the same as the one specified by this parameter; otherwise, an exception is thrown.

request.ifETagMatch

ifETagNoneMatch

Returns the source object if its ETag is different from the one specified by this parameter; otherwise, an exception is thrown.

request.ifETagNoneMatch

  • The ETag of an object is the MD5 check value of the object.
  • If the specified condition is not met, error Precondition Failed will be returned.

Sample code:

static OBSClient *client;
NSString *endPoint = @"your-endpoint";
// Hard-coded or plaintext AK/SK are risky. For security purposes, encrypt your AK/SK and store them in the configuration file or environment variables. In this example, the AK/SK are stored in environment variables for identity authentication. Before running this example, configure environment variables AccessKeyID and SecretAccessKey.
// Obtain an AK/SK pair on the management console. For details, see https://support.huaweicloud.com/intl/en-us/usermanual-ca/ca_01_0003.html.
char* ak_env = getenv("AccessKeyID");
char* sk_env = getenv("SecretAccessKey");
NSString *AK = [NSString stringWithUTF8String:ak_env];
NSString *SK = [NSString stringWithUTF8String:sk_env];
    
// Initialize identity authentication.
OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
    
//Initialize service configuration.
OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
    
// Initialize an instance of OBSClient.
client = [[OBSClient alloc] initWithConfiguration:conf];
    
// Streaming download
OBSGetObjectToDataRequest *request = [[OBSGetObjectToDataRequest alloc]initWithBucketName:@"bucketname" objectKey:@"objectname"];
    
// Set conditions.
request.ifModifiedSince = [[OBSUtils getDateFormatterRFC1123]dateFromString:@"Mon, 18 Dec 2017 03:50:49 GMT"];
// Check whether the ETags are the same.
request.ifETagMatch = @"123223";
    
    
//Query the download progress.
request.downloadProgressBlock = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
    NSLog(@"%0.1f%%",(float)(totalBytesWritten)*100/(float)totalBytesExpectedToWrite);
};
    
// Receive downloaded data.
__block NSMutableData *objectData = [NSMutableData new];
request.onReceiveDataBlock = ^(NSData *data) {
    [objectData appendData:data];
};
    
// Download result
[client getObject:request completionHandler:^(OBSGetObjectResponse *response, NSError *error){
    NSLog(@"%@",response);
}] ;

When calling OBSGetObjectToFileRequest, you can set background to YES to enable background download.