use cos_rust_sdk::{
Config, CosClient, ObjectClient, BucketClient, ListObjectsV2Options
};
use std::env;
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let secret_id = env::var("COS_SECRET_ID")
.expect("Please set COS_SECRET_ID environment variable");
let secret_key = env::var("COS_SECRET_KEY")
.expect("Please set COS_SECRET_KEY environment variable");
let region = env::var("COS_REGION")
.expect("Please set COS_REGION environment variable");
let bucket = env::var("COS_BUCKET")
.expect("Please set COS_BUCKET environment variable");
println!("=== 腾讯云 COS Rust SDK 基本使用示例 ===");
println!("Region: {}", region);
println!("Bucket: {}", bucket);
println!();
let config = Config::new(&secret_id, &secret_key, ®ion, &bucket)
.with_timeout(Duration::from_secs(30))
.with_https(true);
let cos_client = CosClient::new(config)?;
let object_client = ObjectClient::new(cos_client.clone());
let bucket_client = BucketClient::new(cos_client);
println!("1. 检查存储桶是否存在...");
match bucket_client.bucket_exists().await {
Ok(exists) => {
if exists {
println!(" ✅ 存储桶存在");
} else {
println!(" ❌ 存储桶不存在");
return Ok(());
}
}
Err(e) => {
println!(" ❌ 检查存储桶失败: {}", e);
return Err(e.into());
}
}
println!();
println!("2. 上传对象...");
let test_content = format!("Hello, COS! 当前时间: {}", chrono::Utc::now());
let test_key = "rust-sdk-test.txt";
match object_client
.put_object(test_key, test_content.as_bytes().to_vec(), Some("text/plain; charset=utf-8"))
.await
{
Ok(response) => {
println!(" ✅ 上传成功");
println!(" ETag: {}", response.etag);
if let Some(version_id) = response.version_id {
println!(" Version ID: {}", version_id);
}
}
Err(e) => {
println!(" ❌ 上传失败: {}", e);
return Err(e.into());
}
}
println!();
println!("3. 检查对象是否存在...");
match object_client.object_exists(test_key).await {
Ok(exists) => {
if exists {
println!(" ✅ 对象存在");
} else {
println!(" ❌ 对象不存在");
}
}
Err(e) => {
println!(" ❌ 检查对象失败: {}", e);
}
}
println!();
println!("4. 获取对象元数据...");
match object_client.head_object(test_key).await {
Ok(response) => {
println!(" ✅ 获取元数据成功");
println!(" 大小: {} 字节", response.content_length);
println!(" 内容类型: {}", response.content_type);
println!(" ETag: {}", response.etag);
if let Some(last_modified) = response.last_modified {
println!(" 最后修改时间: {}", last_modified);
}
}
Err(e) => {
println!(" ❌ 获取元数据失败: {}", e);
}
}
println!();
println!("5. 下载对象...");
match object_client.get_object(test_key).await {
Ok(response) => {
println!(" ✅ 下载成功");
println!(" 内容: {}", String::from_utf8_lossy(&response.data));
println!(" 大小: {} 字节", response.content_length);
}
Err(e) => {
println!(" ❌ 下载失败: {}", e);
}
}
println!();
println!("6. 列出存储桶中的对象(最多10个)...");
let list_options = ListObjectsV2Options {
max_keys: Some(10),
..Default::default()
};
match bucket_client.list_objects_v2(Some(list_options)).await {
Ok(response) => {
println!(" ✅ 列出对象成功");
println!(" 对象数量: {}", response.key_count);
println!(" 是否截断: {}", response.is_truncated);
if response.contents.is_empty() {
println!(" 📁 存储桶为空");
} else {
println!(" 📁 对象列表:");
for (i, object) in response.contents.iter().enumerate() {
println!(" {}. {} ({} 字节) - {}",
i + 1, object.key, object.size, object.last_modified);
}
}
}
Err(e) => {
println!(" ❌ 列出对象失败: {}", e);
}
}
println!();
println!("7. 删除测试对象...");
match object_client.delete_object(test_key).await {
Ok(response) => {
println!(" ✅ 删除成功");
if let Some(version_id) = response.version_id {
println!(" Version ID: {}", version_id);
}
if response.delete_marker {
println!(" 删除标记: true");
}
}
Err(e) => {
println!(" ❌ 删除失败: {}", e);
}
}
println!();
println!("8. 验证对象已被删除...");
match object_client.object_exists(test_key).await {
Ok(exists) => {
if !exists {
println!(" ✅ 对象已成功删除");
} else {
println!(" ⚠️ 对象仍然存在");
}
}
Err(e) => {
println!(" ❌ 检查对象失败: {}", e);
}
}
println!();
println!("=== 示例完成 ===");
Ok(())
}