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/eu/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.