更新时间:2023-11-09 GMT+08:00

设置对象属性

开发过程中,您有任何问题可以在github上提交issue

您可以在上传对象时设置对象属性。对象属性包含对象长度、对象MIME类型、对象MD5值(用于校验)、对象存储类型、对象自定义元数据。对象属性可以在多种上传方式下(流式上传、文件上传、分段上传、基于表单上传),或复制对象时进行设置。对象属性参数在结构体obs_put_properties中。

对象属性详细说明见下表:

名称

描述

默认值

对象长度(content_length)

上传对象的长度,超过流/文件的长度会截断。

流/文件实际长度

对象MIME类型(content_type)

对象的MIME类型,定义对象的类型及网页编码,决定浏览器将以什么形式、什么编码读取对象。

对象MD5值(md5)

对象数据的MD5值(经过Base64编码),提供给OBS服务端,校验数据完整性。

对象存储类型

对象的存储类型,不同的存储类型可以满足客户业务对存储性能、成本的不同诉求。默认与桶的存储类型保持一致,可以设置为与桶的存储类型不同。

对象自定义元数据

用户对上传到桶中对象的自定义属性描述,以便对对象进行自定义管理。

设置对象MIME类型

您可以通过在结构体obs_put_properties中对元素content_type赋值来设置对象MIME类型。以文件上传为例展示如何设置对象MIME类型:
static void test_put_object_from_file2()
{
    // 创建并初始化option
    obs_options option;
    init_obs_options(&option);
    option.bucket_options.host_name = "<your-endpoint>";
    option.bucket_options.bucket_name = "<Your bucketname>";

    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY。
    // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
    option.bucket_options.access_key = getenv("ACCESS_KEY_ID");
    option.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY");
    // 初始化结构体put_properties,可以通过该结构体设置对象属性
    obs_put_properties put_properties;
    init_put_properties(&put_properties);
    // 设置MIME类型
    put_properties.content_type = "text/html";
    // 回调数据
    put_file_object_callback_data data;
    memset(&data, 0, sizeof(put_file_object_callback_data));
    // 将要上传的文件读到回调数据中
    data.infile = 0;
    data.noStatus = 1;
    content_length = read_bytes_from_file("<Uploaded filename>", &data);
    // 回调函数
    obs_put_object_handler putobjectHandler =
    {
        { &response_properties_callback, &response_complete_callback },
        &put_object_data_callback
     };
    // 上传数据流
    put_object(&option,"<object key>", content_length, &put_properties, 0, &putobjectHandler, &data);
    if (OBS_STATUS_OK == data.ret_status) {
        printf("put object from file successfully. \n");
    }
    else
    {
        printf("put object failed(%s).\n",  
               obs_get_status_name(data.ret_status));
    }
}

如果不设置对象MIME类型,SDK会根据上传对象的后缀名自动判断对象MIME类型,如.xml判断为application/xml文件;.html判断为text/html文件。

设置对象存储类型

您可以通过obs_bucket_context中对元素storage_class赋值来设置对象存储类型。以下代码展示如何设置对象存储类型:

static void test_put_object_from_file3()
{
    // 创建并初始化option
    obs_options option;
    init_obs_options(&option);
    option.bucket_options.host_name = "<your-endpoint>";
    option.bucket_options.bucket_name = "<Your bucketname>";

    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY。
    // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
    option.bucket_options.access_key = getenv("ACCESS_KEY_ID");
    option.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY");
    //设置存储类型为归档存储
    option.bucket_options.storage_class = OBS_STORAGE_CLASS_GLACIER;
    // 初始化结构体put_properties,可以通过该结构体设置对象属性
    obs_put_properties put_properties;
    init_put_properties(&put_properties);
    // 回调数据
    put_file_object_callback_data data;
    memset(&data, 0, sizeof(put_file_object_callback_data));
    // 将要上传的文件读到回调数据中
    data.infile = 0;
    data.noStatus = 1;
    content_length = read_bytes_from_file("<Uploaded filename>", &data);
    // 回调函数
    obs_put_object_handler putobjectHandler =
    {
        { &response_properties_callback, &response_complete_callback },
        &put_object_data_callback
    };
    // 上传数据流
    put_object(&option,"<object key>", content_length, &put_properties, 0, &putobjectHandler, &data);
    if (OBS_STATUS_OK == data.ret_status) {
        printf("put object from file successfully. \n");
    }
    else
    {
        printf("put object failed(%s).\n",  
           obs_get_status_name(data.ret_status));
    }

}
  • 如果不设置,对象的存储类型默认与桶的存储类型保持一致。
  • 对象的存储类型分为三类,其含义与桶存储类型一致。
  • 下载归档存储类型的对象前必须将其恢复。

设置对象自定义元数据

您可以通过obs_put_properties中对元素meta_data赋值来设置对象自定义元数据。以下代码展示如何设置对象自定义元数据:

static void test_put_object_from_file4()
{
    // 创建并初始化option
    obs_options option;
    init_obs_options(&option);
    option.bucket_options.host_name = "<your-endpoint>";
    option.bucket_options.bucket_name = "<Your bucketname>";

    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY。
    // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
    option.bucket_options.access_key = getenv("ACCESS_KEY_ID");
    option.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY");
    // 初始化结构体put_properties,可以通过该结构体设置对象属性
    obs_put_properties put_properties;
    init_put_properties(&put_properties);
    //设置自定义元数据
    obs_name_value matadata;
    matadata.name ="property1";
    matadata.value ="property-value1";
    put_properties.meta_data = matadata;
    // 回调数据
    put_file_object_callback_data data;
    memset(&data, 0, sizeof(put_file_object_callback_data));
    // 将要上传的文件读到回调数据中
    data.infile = 0;
    data.noStatus = 1;
    content_length = read_bytes_from_file("<Uploaded filename>", &data);
    // 回调函数
    obs_put_object_handler putobjectHandler =
    {
        { &response_properties_callback, &response_complete_callback },
        &put_object_data_callback
     };
    // 上传数据流
    put_object(&option,"<object key>", content_length, &put_properties, 0, &putobjectHandler, &data);
    if (OBS_STATUS_OK == data.ret_status) {
        printf("put object from file successfully. \n");
    }
    else
    {
        printf("put object failed(%s).\n",  
               obs_get_status_name(data.ret_status));
    }
}
  • 在上面设置对象自定义元数据示例代码中,用户自定义了一个名称为“property1”,值为“property-value1”的元数据
  • 一个对象可以有多个元数据,总大小不能超过8KB。
  • 对象的自定义元数据可以通过get_object_metadata获取,参见获取对象属性
  • 使用get_object下载对象时,对象的自定义元数据也会同时下载。