Skip to content

Commit

Permalink
feat(file): remove put_file and more method
Browse files Browse the repository at this point in the history
in Object<RcPointer>
  • Loading branch information
tu6ge committed Mar 6, 2023
1 parent 03edbd3 commit 5a95a8f
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 208 deletions.
206 changes: 0 additions & 206 deletions src/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -967,210 +967,4 @@ pub mod blocking {
.builder_with_header(method, url, resource, headers)
}
}

impl Object<RcPointer> {
/// # 将当前 Object 的文件上传到 OSS
///
/// 需指定要上传的本地文件路径
#[cfg(feature = "put_file")]
pub fn put_file<
P: Into<std::path::PathBuf> + std::convert::AsRef<std::path::Path>,
B: AlignBuilder,
>(
&self,
file_name: P,
builder: &B,
) -> Result<String, FileError> {
let file_content = std::fs::read(file_name)?;

let get_content_type =
|content: &Vec<u8>| Infer::new().get(content).map(|con| con.mime_type());

self.put_content(file_content, get_content_type, builder)
}

/// # 上传文件内容到 OSS
///
/// 需指定要上传的文件内容
/// 以及根据文件内容获取文件类型的闭包
pub fn put_content<F, B>(
&self,
content: Vec<u8>,
get_content_type: F,
builder: &B,
) -> Result<String, FileError>
where
F: Fn(&Vec<u8>) -> Option<&'static str>,
B: AlignBuilder,
{
let content_type = get_content_type(&content).unwrap_or("application/octet-stream");

let content = self.put_content_base(content, content_type, builder)?;

let result = content
.headers()
.get("ETag")
.ok_or(FileError::EtagNotFound)?
.to_str()
.map_err(FileError::from)?;

Ok(result.to_string())
}

/// 最原始的上传文件的方法
pub fn put_content_base<B: AlignBuilder>(
&self,
content: Vec<u8>,
content_type: &str,
builder: &B,
) -> Result<Response, FileError> {
let (url, canonicalized) = self.base.get_url_resource([]);

let content_length = content.len().to_string();
let headers = vec![
(
CONTENT_LENGTH,
HeaderValue::from_str(&content_length).map_err(FileError::from)?,
),
(CONTENT_TYPE, content_type.parse().map_err(FileError::from)?),
];

builder
.builder_with_header(Method::PUT, url, canonicalized, headers)
.map_err(FileError::from)?
.body(content)
.send_adjust_error()
.map_err(FileError::from)
}

/// # 获取 Object 对应的 OSS 上的资源文件
/// 可以获取一部分
pub fn get_object<R: Into<ContentRange>, B: AlignBuilder>(
&self,
range: R,
builder: &B,
) -> Result<Vec<u8>, FileError> {
let (url, canonicalized) = self.base.get_url_resource([]);

let list: Vec<(_, HeaderValue)> = vec![("Range".parse().unwrap(), range.into().into())];

let content = builder
.builder_with_header(Method::GET, url, canonicalized, list)?
.send_adjust_error()?
.text()
.map_err(FileError::from)?;

Ok(content.into_bytes())
}

/// 删除 Object 对应的 OSS 上的资源文件
pub fn delete_object<B: AlignBuilder>(&self, builder: &B) -> Result<(), FileError> {
let (url, canonicalized) = self.base.get_url_resource([]);

builder
.builder(Method::DELETE, url, canonicalized)?
.send_adjust_error()?;

Ok(())
}
}

#[cfg(test)]
mod tests_macro {
use chrono::{DateTime, NaiveDateTime, Utc};

use crate::{
builder::RcPointer,
object::{Object, StorageClass},
ClientRc,
};
use std::rc::Rc;

fn init_object() -> Object<RcPointer> {
let bucket = Rc::new("abc.oss-cn-shanghai.aliyuncs.com".parse().unwrap());
Object::<RcPointer>::new(
bucket,
"foo2".parse().unwrap(),
DateTime::<Utc>::from_utc(
NaiveDateTime::from_timestamp_opt(123000, 0).unwrap(),
Utc,
),
"foo3".into(),
"foo4".into(),
100,
StorageClass::Archive,
)
}

fn init_client() -> ClientRc {
use std::env::set_var;
set_var("ALIYUN_KEY_ID", "foo1");
set_var("ALIYUN_KEY_SECRET", "foo2");
set_var("ALIYUN_ENDPOINT", "qingdao");
set_var("ALIYUN_BUCKET", "foo4");
ClientRc::from_env().unwrap()
}

#[test]
#[cfg(feature = "put_file")]
fn test_object_put_file() {
let object = init_object();

let client = init_client();

let res = object.put_file("abc", &client);

assert!(res.is_err());
}

#[test]
fn test_object_put_content() {
let object = init_object();

let client = init_client();

let content: Vec<u8> =
String::from("dW50cnVzdGVkIGNvbW1lbnQ6IHNpxxxxxxxxx").into_bytes();

let res = object.put_content(content, |_| Some("image/png"), &client);

assert!(res.is_err());
}

#[test]
fn test_object_put_content_base() {
let object = init_object();

let client = init_client();

let content: Vec<u8> =
String::from("dW50cnVzdGVkIGNvbW1lbnQ6IHNpxxxxxxxxx").into_bytes();

let res = object.put_content_base(content, "image/png", &client);

assert!(res.is_err());
}

#[test]
fn test_object_get_object() {
let object = init_object();

let client = init_client();

let res = object.get_object(.., &client);

assert!(res.is_err());
}

#[test]
fn test_object_delete() {
let object = init_object();

let client = init_client();

let res = object.delete_object(&client);

assert!(res.is_err());
}
}
}
4 changes: 2 additions & 2 deletions src/tests/bucket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ fn test_get_blocking_bucket_list() {
//println!("{:?}", res);
assert_eq!(
format!("{:?}", res),
r#"Ok(ListBuckets { prefix: None, marker: None, max_keys: None, is_truncated: false, next_marker: None, id: None, display_name: None, buckets: [] })"#
r#"Ok(ListBuckets { prefix: None, marker: None, max_keys: 0, is_truncated: false, next_marker: None, id: None, display_name: None, buckets: [] })"#
);
}

Expand Down Expand Up @@ -272,7 +272,7 @@ fn test_get_blocking_bucket_info() {
//println!("{:?}", res);
assert_eq!(
format!("{:?}", res),
r#"Ok(Bucket { base: BucketBase { endpoint: CnShanghai, name: BucketName("barname") }, creation_date: 2016-11-05T13:10:10Z, location: "oss-cn-shanghai", storage_class: "Standard" })"#
r#"Ok(Bucket { base: BucketBase { endpoint: CnShanghai, name: BucketName("barname") }, creation_date: 2016-11-05T13:10:10Z, storage_class: Standard })"#
);
}

Expand Down

0 comments on commit 5a95a8f

Please sign in to comment.