You need to enable JavaScript to run this app.
文档中心
对象存储

对象存储

复制全文
下载 pdf
基础操作
PutObject(Rust SDK)
复制全文
下载 pdf
PutObject(Rust SDK)
put_object 接口用于向指定桶上传对象,支持加密、ACL、存储类型、标签、限速等配置。本文介绍如何通过 Rust SDK 的 put_object 接口完成上传。​
注意事项​
  • 您需要根据实际情况,填写示例代码中的地域和访问域名,详细介绍,请参见 地域和访问域名。​
  • 为了防止密钥泄露,本文示例代码需要从环境变量中读取 Access Key ID 和 Secret Access Key。因此使用 SDK 前,您需要配置长期访问凭证,详细介绍,请参见 配置长期访问凭证。​
  • 当桶开启多版本时,forbid_overwrite 设置无效,同名对象始终允许覆盖。​
权限说明​
火山引擎主账号默认拥有全部权限,但是 IAM 用户默认没有任何权限。如果您需要使用子账号执行 put_object 操作,火山引擎主账号需通过 IAM策略和桶策略为该子账号授予以下权限:​
tos:PutObject​
代码示例​
上传字符串​
​
use async_trait::async_trait;​
use futures_core::future::BoxFuture;​
use std::env;​
use std::future::Future;​
use std::time::Duration;​
use tokio::runtime::Handle;​
use ve_tos_rust_sdk::asynchronous::object::ObjectAPI;​
use ve_tos_rust_sdk::common::init_tracing_log;​
use ve_tos_rust_sdk::asynchronous::tos::{new_stream, BufferStream};​
use ve_tos_rust_sdk::asynchronous::tos::AsyncRuntime;​
use ve_tos_rust_sdk::object::{PutObjectInput};​
use ve_tos_rust_sdk::asynchronous::tos;​
use ve_tos_rust_sdk::error::TosError;​
​
#[derive(Debug, Default)]​
pub struct TokioRuntime {}​
​
#[async_trait]​
impl AsyncRuntime for TokioRuntime {​
type JoinError = tokio::task::JoinError;​
async fn sleep(&self, duration: Duration) {​
tokio::time::sleep(duration).await;​
}​
​
fn spawn<'a, F>(&self, future: F) -> BoxFuture<'a, Result<F::Output, Self::JoinError>>​
where​
F: Future + Send + 'static,​
F::Output: Send + 'static,​
{​
Box::pin(Handle::current().spawn(future))​
}​
​
fn block_on<F: Future>(&self, future: F) -> F::Output {​
Handle::current().block_on(future)​
}​
}​
​
#[tokio::main]​
async fn main() {​
let _guard = init_tracing_log("info", "temp/logs", "app.log");​
let ak = env::var("TOS_ACCESS_KEY").unwrap_or("".to_string());​
let sk = env::var("TOS_SECRET_KEY").unwrap_or("".to_string());​
let endpoint = "https://tos-cn-beijing.volces.com";​
let region = "cn-beijing";​
let bucket = "example-bucket-2";​
​
let client = tos::builder::<TokioRuntime>()​
.connection_timeout(3000)​
.request_timeout(10000)​
.max_retry_count(3)​
.ak(ak)​
.sk(sk)​
.region(region)​
.endpoint(endpoint)​
.build().unwrap();​
​
// Upload String​
let data = "Hello, TOS! This is a test string.";​
let stream = new_stream(data);​
let key = "uploaded_string.txt";​
let mut input = PutObjectInput::<BufferStream>::new_with_content(bucket, key, stream);​
​
let output = client.put_object(&input).await;​
match output {​
Ok(res) => {​
println!("Upload string success");​
println!("request_id: {}", res.request_id());​
println!("etag: {}", res.etag());​
println!("hash_crc64ecma: {}", res.hash_crc64ecma());​
}​
Err(err) => {​
match err {​
TosError::TosClientError { message, .. } => println!("Client error: {}", message),​
TosError::TosServerError { request_id, ec, code, .. } => println!("Server error: request_id={}, ec={}, code={}", request_id, ec, code),​
_ => println!("Unknown error: {:?}", err),​
}​
}​
}​
}​
​
上传时设置对象元数据信息​
​
use async_trait::async_trait;​
use futures_core::future::BoxFuture;​
use std::env;​
use std::future::Future;​
use std::time::Duration;​
use std::collections::HashMap;​
use tokio::runtime::Handle;​
use ve_tos_rust_sdk::common::init_tracing_log;​
use ve_tos_rust_sdk::asynchronous::object::ObjectAPI;​
use ve_tos_rust_sdk::asynchronous::tos;​
use ve_tos_rust_sdk::asynchronous::tos::AsyncRuntime;​
use ve_tos_rust_sdk::object::PutObjectInput;​
use ve_tos_rust_sdk::object::BufferStream;​
use ve_tos_rust_sdk::error::TosError;​
​
#[derive(Debug, Default)]​
pub struct TokioRuntime {}​
​
#[async_trait]​
impl AsyncRuntime for TokioRuntime {​
type JoinError = tokio::task::JoinError;​
async fn sleep(&self, duration: Duration) {​
tokio::time::sleep(duration).await;​
}​
​
fn spawn<'a, F>(&self, future: F) -> BoxFuture<'a, Result<F::Output, Self::JoinError>>​
where​
F: Future + Send + 'static,​
F::Output: Send + 'static,​
{​
Box::pin(Handle::current().spawn(future))​
}​
​
fn block_on<F: Future>(&self, future: F) -> F::Output {​
Handle::current().block_on(future)​
}​
}​
​
#[tokio::main]​
async fn main() {​
let _guard = init_tracing_log("info", "temp/logs", "app.log");​
let ak = env::var("TOS_ACCESS_KEY").unwrap_or("".to_string());​
let sk = env::var("TOS_SECRET_KEY").unwrap_or("".to_string());​
let endpoint = "https://tos-cn-beijing.volces.com";​
let region = "cn-beijing";​
let bucket = "example-bucket";​
​
let client = tos::builder::<TokioRuntime>()​
.connection_timeout(3000)​
.request_timeout(10000)​
.max_retry_count(3)​
.ak(ak)​
.sk(sk)​
.region(region)​
.endpoint(endpoint)​
.build().unwrap();​
​
// Upload with Metadata​
let data = "Data with custom metadata";​
let stream = BufferStream::new(data.as_bytes().into());​
let key = "file_with_metadata.txt";​
let mut input = PutObjectInput::<BufferStream>::new_with_content(bucket, key, stream);​
​
// Set custom metadata​
let mut meta = HashMap::new();​
meta.insert("author".to_string(), "John Doe".to_string());​
meta.insert("project".to_string(), "TOS SDK Example".to_string());​
meta.insert("version".to_string(), "1.0".to_string());​
input.set_meta(meta);​
​
// Set additional metadata fields​
input.set_content_type("text/plain");​
input.set_cache_control("max-age=3600");​
input.set_content_disposition("attachment; filename=\"metadata_file.txt\"");​
​
let output = client.put_object(&input).await;​
match output {​
Ok(res) => {​
println!("Upload with metadata success");​
println!("request_id: {}", res.request_id());​
println!("etag: {}", res.etag());​
println!("hash_crc64ecma: {}", res.hash_crc64ecma());​
}​
Err(err) => {​
match err {​
TosError::TosClientError { message, .. } => println!("Client error: {}", message),​
TosError::TosServerError { request_id, ec, code, .. } => println!("Server error: request_id={{}}, ec={{}}, code={{}}", request_id, ec, code),​
_ => println!("Unknown error: {{:?}}", err),​
}​
}​
}​
}​
​
上传本地文件流​
​
use async_trait::async_trait;​
use futures_core::future::BoxFuture;​
use std::env;​
use std::future::Future;​
use std::time::Duration;​
use tokio::runtime::Handle;​
use tokio::fs::File;​
use tokio_util::io::ReaderStream;​
use ve_tos_rust_sdk::common::init_tracing_log;​
use ve_tos_rust_sdk::asynchronous::object::ObjectAPI;​
use ve_tos_rust_sdk::asynchronous::tos::AsyncRuntime;​
use ve_tos_rust_sdk::object::PutObjectInput;​
use ve_tos_rust_sdk::asynchronous::tos;​
use ve_tos_rust_sdk::error::TosError;​
​
#[derive(Debug, Default)]​
pub struct TokioRuntime {}​
​
#[async_trait]​
impl AsyncRuntime for TokioRuntime {​
type JoinError = tokio::task::JoinError;​
async fn sleep(&self, duration: Duration) {​
tokio::time::sleep(duration).await;​
}​
​
fn spawn<'a, F>(&self, future: F) -> BoxFuture<'a, Result<F::Output, Self::JoinError>>​
where​
F: Future + Send + 'static,​
F::Output: Send + 'static,​
{​
Box::pin(Handle::current().spawn(future))​
}​
​
fn block_on<F: Future>(&self, future: F) -> F::Output {​
Handle::current().block_on(future)​
}​
}​
​
#[tokio::main]​
async fn main() {​
let _guard = init_tracing_log("info", "temp/logs", "app.log");​
let ak = env::var("TOS_ACCESS_KEY").unwrap_or("".to_string());​
let sk = env::var("TOS_SECRET_KEY").unwrap_or("".to_string());​
let endpoint = "https://tos-cn-beijing.volces.com";​
let region = "cn-beijing";​
let bucket = "example-bucket-2";​
​
let client = tos::builder::<TokioRuntime>()​
.connection_timeout(3000)​
.request_timeout(10000)​
.max_retry_count(3)​
.ak(ak)​
.sk(sk)​
.region(region)​
.endpoint(endpoint)​
.build().unwrap();​
​
// Upload Local File​
let file_path = "test_file.txt"; // Replace with actual path​
let file = match tokio::fs::File::open(file_path).await {​
Ok(f) => f,​
Err(e) => {​
println!("Failed to open file: {}", e);​
return;​
}​
};​
let stream = ReaderStream::new(file);​
let key = "uploaded_file.txt";​
let input = PutObjectInput::<ReaderStream<File>>::new_with_content(bucket, key, stream);​
​
let output = client.put_object(&input).await;​
match output {​
Ok(res) => {​
println!("Upload local file success");​
println!("request_id: {}", res.request_id());​
println!("etag: {}", res.etag());​
println!("hash_crc64ecma: {}", res.hash_crc64ecma());​
}​
Err(err) => {​
match err {​
TosError::TosClientError { message, .. } => println!("Client error: {}", message),​
TosError::TosServerError { request_id, ec, code, .. } => println!("Server error: request_id={}, ec={}, code={}", request_id, ec, code),​
_ => println!("Unknown error: {:?}", err),​
}​
}​
}​
}​
​
相关文档​
关于 PutObject 的 API 文档,请参见 PutObject。​
​
最近更新时间:2025.12.22 16:33:48
这个页面对您有帮助吗?
有用
有用
无用
无用