
# 普通上传设置上传回调
#### 功能说明
您可以在上传对象请求（PutObject）中设置回调参数，OBS在对象上传成功之后，将上传结果回调特定服务器，并将回调结果返回给您。
#### 方法定义
```
- (OBSBFTask*)putObject:(OBSPutObjectWithFileRequest *)request
         completionHandler:(void (^)(OBSPutObjectResponse *response, NSError *error))completionHandler;
```
#### 请求参数说明
表1OBSPutObjectWithFileRequest 
| **参数名称**       | **参数类型**                                          | **是否必选** | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|:---|
| bucketName     | NSString \*                                       | 必选       | **参数解释** **：** 桶名。 **约束限制：** - 桶的名字需全局唯一，不能与已有的任何桶名称重复，包括其他用户创建的桶。  - 桶命名规则如下： - 3～63个字符，数字或字母开头，支持小写字母、数字、"-"、"."。  - 禁止使用IP地址。  - 禁止以"-"或"."开头及结尾。  - 禁止两个"."相邻（如："my..bucket"）。  - 禁止"."和"-"相邻（如："my-.bucket"和"my.-bucket"）。    - 同一用户在同一个区域多次创建同名桶不会报错，创建的桶属性以第一次请求为准。   **默认取值：** 无 |
| objectKey      | NSString \*                                       | 必选       | **参数解释：** 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径，路径中不包含桶名。 例如，您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中，对象名为folder/test.txt。 **取值范围：** 长度大于0且不超过1024的字符串。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| uploadFilePath | NSString \*                                       | 必选       | **参数解释：** 待上传对象的文件。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| callBack       | [OBSCallBack] \* | 可选       | **参数解释：** 上传回调相关参数。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   
 表2OBSCallBack 
| **参数名称**         | **参数类型**    | **是否必选** | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|:---|
| callbackUrl      | NSString \* | 必选       | **参数解释：** 对象上传成功之后，OBS向此url发送回调请求，请求方法为POST。 **约束限制：** - 最多支持设置10个url，以英文分号（;）分隔。  - callbackUrl需要做url编码。例如："http://www.example.com/中文?key=中文名"需要编码成"http://www.example.com/%E4%B8%AD%E6%96%87?key=%E4%B8%AD%E6%96%87%E5%90%8D"。                                                                                                                               |
| callbackHost     | NSString \* | 可选       | **参数解释：** 发起回调请求的Host头域的值。 **约束限制：** 如果不设置callbackHost的值，会使用callbackUrl解析出来的Host。                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| callbackBody     | NSString \* | 必选       | **参数解释：** 发起回调请求的body体。 **约束限制：** body体格式必须符合callbackBodyType中设置的媒体类型。 **默认取值：** 回调body体支持系统变量和自定义变量，系统变量如[回调body体支持的系统变量](https://support.huaweicloud.com/api-obs/obs_04_0095.html#obs_04_0095__table695016242719)所示，自定义变量就是以x:开头的变量。例如：key=$(key)\&hash=$(etag)\&fileid=$(x:fileid)，其中变量key、etag是系统变量，x:fileid是自定义变量。如果用户上传的对象是图片，可以在参数中设置imageInfo.width和imageInfo.height表示该图片的宽高。例如：key=$(key)\&hash=$(etag)\&w=$(imageInfo.width)\&h=$(imageInfo.height)。 |
| callbackBodyType | NSString \* | 可选       | **参数解释：** 发起回调请求的Content-Type头域的值。 **取值范围：** - application/x-www-form-urlencoded  - application/json   **默认取值：** 如果不设置，默认为application/json。                                                                                                                                                                                         |
   
#### 返回结果说明
表3OBSPutObjectResponse 
| **参数名称**        | **参数类型**         | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|
| statusCode      | NSString \*      | **参数解释：** HTTP状态码。 **取值范围：** 状态码是一组从2xx（成功）到4xx或5xx（错误）的数字代码，状态码表示了请求响应的状态。 完整的状态码列表请参见[状态码](https://support.huaweicloud.com/api-obs/obs_04_0114.html)。 **默认取值：** 无                                                                                                                                                                                                                                                                           |
| headers         | NSDictionary \*  | **参数解释：** 响应消息头列表，由多个元组构成。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| versionID       | NSString \*      | **参数解释：** 对象的版本号。如果桶的多版本状态为开启，则会返回对象的版本号。 **取值范围：** 长度为32的字符串。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| etag            | NSString \*      | **参数解释：** 对象的etag值，即Base64编码的128位MD5摘要。etag是对象内容的唯一标识，可以通过该值识别对象内容是否有变化。比如上传对象时etag为A，下载对象时etag为B，则说明对象内容发生了变化。etag只反映变化的内容，而不是其元数据。上传的对象或拷贝操作创建的对象，都有唯一的etag。 **约束限制：** 当对象是服务端加密的对象时，etag值不是对象的MD5值。 **取值范围：** 长度为32的字符串。 **默认取值：** 无 |
| responseRawData | NSMutableData \* | **参数解释** **：** 响应体的原始数据。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   
#### 代码示例
此示例用于普通上传对象（PutObject）时设置上传回调：
```
void testPutObjectWithCallback(){
//    NSString *endPoint = @"https://your-endpoint";
    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
    // 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
    NSString* endPoint = @"https://obs.cn-north-4.myhuaweicloud.com";
    char* ak_env = getenv("AccessKeyID");
    char* sk_env = getenv("SecretAccessKey");
    char* securityToken_env = getenv("SecurityToken");
    if (ak_env == NULL || sk_env == NULL) {
    NSLog(@"Error: AccessKeyID or SecretAccessKey environment variable not set");
    return;
}
NSString *AK = [NSString stringWithUTF8String:ak_env];
    NSString *SK = [NSString stringWithUTF8String:sk_env];
    // NSString* securityToken = [NSString stringWithUTF8String:securityToken_env ?: @""];
    NSString* exampleBucketName = @"example-bucket-name";
    NSString* exampleObjectKey = @"objectname.pic";
    NSString* exampleFile = [[NSBundle mainBundle]pathForResource:@"pic" ofType:@"jpeg"];
    if (!exampleFile) {
        exampleFile = @"";
    }
    NSString* exampleCallbackUrl = @"https://www.example-url.com";
    NSString* exampleCallbackBody = @"exampleCallbackBody";
    NSString* exampleCallbackHost = @"example-host.com";
    NSString* exampleCallbackBodyType = @"application/json";
    // 初始化身份验证
    OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
    // 【可选】如果使用临时AKSK和SecurityToken访问OBS，需要指定securityToken值。
    // credentialProvider.securityToken = securityToken;
    // 初始化服务配置
    OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
    // 初始化client
    OBSClient *client = [[OBSClient alloc] initWithConfiguration:conf];
    // 初始化上传对象请求putObjectRequest
    OBSPutObjectWithFileRequest * putObjectRequest = [[OBSPutObjectWithFileRequest alloc] initWithBucketName:exampleBucketName objectKey:exampleObjectKey uploadFilePath:exampleFile];
    putObjectRequest.callback = [[OBSCallback alloc] initWithUrl:exampleCallbackUrl
                                                        withBody:exampleCallbackBody
                                                    withBodyType:exampleCallbackBodyType
                                                        withHost:exampleCallbackHost];
    // 初始化上传对象异步任务
    OBSBFTask* putObjectTask = [client putObject:putObjectRequest completionHandler:^(OBSPutObjectResponse *response, NSError *error) {
        if(error){
            // 上传失败
            NSLog(@"PutObject failed:%@", error);
        }
        if(response){
            NSLog(@"PutObject response:%@", response);
            NSString* callbackResponseString = [[NSString alloc] initWithData:response.responseRawData
                                                                     encoding:NSUTF8StringEncoding];
            NSLog(@"PutObject callbackResponseString:%@", callbackResponseString);
        }
    }];
    // 等待上传对象异步任务完成
    [putObjectTask waitUntilFinished];
}
```
![](https://support.huaweicloud.com/sdk-ios-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
当前SDK的文件上传接口（OBSPutObjectWithFileRequest、OBSUploadFileRequest）的uploadFilePath参数仅接受NSString类型的文件路径，不支持直接传入\[NSURL fileURLWithPath:@"xxx"\]构造的NSURL对象。如需使用NSURL，请先通过\[fileURL path\]获取文件路径字符串，再传入uploadFilePath参数。
