设置对象属性
开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。
您可以在上传对象时设置对象属性。对象属性包含对象长度、对象MIME类型、对象MD5值(用于校验)、对象存储类型、对象自定义元数据。对象属性可以在多种上传方式下(流式上传、文件上传、分段上传、基于表单上传),或复制对象时进行设置。对象属性参数在结构体obs_put_properties中。
对象属性详细说明见下表:
名称 |
描述 |
默认值 |
---|---|---|
对象长度(content_length) |
上传对象的长度,超过流/文件的长度会截断。 |
流/文件实际长度 |
对象MIME类型(content_type) |
对象的MIME类型,定义对象的类型及网页编码,决定浏览器将以什么形式、什么编码读取对象。 |
无 |
对象MD5值(md5) |
对象数据的MD5值(经过Base64编码),提供给OBS服务端,校验数据完整性。 |
无 |
对象存储类型 |
对象的存储类型,不同的存储类型可以满足客户业务对存储性能、成本的不同诉求。默认与桶的存储类型保持一致,可以设置为与桶的存储类型不同。 |
无 |
对象自定义元数据 |
用户对上传到桶中对象的自定义属性描述,以便对对象进行自定义管理。 |
无 |
设置对象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/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/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/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下载对象时,对象的自定义元数据也会同时下载。