媒体类型
从字符串获取 MIME 类型
下面的示例演示,如何用mime箱子,从字符串中解析出一个MIME
类型。FromStrError
会在unwrap_or
作用域,生成一个默认MIME
类型。
extern crate mime; use mime::{Mime, APPLICATION_OCTET_STREAM}; fn main() { let invalid_mime_type = "i n v a l i d"; let default_mime = invalid_mime_type .parse::<Mime>() .unwrap_or(APPLICATION_OCTET_STREAM); println!( "MIME for {:?} used default value {:?}", invalid_mime_type, default_mime ); let valid_mime_type = "TEXT/PLAIN"; let parsed_mime = valid_mime_type .parse::<Mime>() .unwrap_or(APPLICATION_OCTET_STREAM); println!( "MIME for {:?} was parsed as {:?}", valid_mime_type, parsed_mime ); }
从文件名,获取 MIME 类型
下面的示例演示,如何使用mime箱子,从给出的文件名中,返回当前 MIME 类型。程序将检查文件扩展名,并与已知列表匹配。返回值为mime:Mime
。
extern crate mime; use mime::Mime; fn find_mimetype (filename : &String) -> Mime{ let parts : Vec<&str> = filename.split('.').collect(); let res = match parts.last() { Some(v) => match *v { "png" => mime::IMAGE_PNG, "jpg" => mime::IMAGE_JPEG, "json" => mime::APPLICATION_JSON, &_ => mime::TEXT_PLAIN, }, None => mime::TEXT_PLAIN, }; return res; } fn main() { let filenames = vec!("foobar.jpg", "foo.bar", "foobar.png"); for file in filenames { let mime = find_mimetype(&file.to_owned()); println!("MIME for {}: {}", file, mime); } }
分析 HTTP 响应的 mime 类型
从reqwest
那里,接收到一个 HTTP 响应的时候,这个MIME 类型或是媒体类型,可以在Content-Type标头中找到。reqwest::header::HeaderMap::get
将标头检索为reqwest::header::HeaderValue
,这可以转换为一个字符串。这个mime
箱子,之后就可以解析它了,并产生一个mime::Mime
值。
这个mime
箱子,还定义了一些常用的 MIME 类型。
请注意reqwest::header
模块,是从http
箱子导出的。
# #[macro_use] # extern crate error_chain; extern crate mime; extern crate reqwest; use mime::Mime; use std::str::FromStr; use reqwest::header::CONTENT_TYPE; # # error_chain! { # foreign_links { # Reqwest(reqwest::Error); # Header(reqwest::header::ToStrError); # Mime(mime::FromStrError); # } # } fn run() -> Result<()> { let response = reqwest::get("https://www.rust-lang.org/logos/rust-logo-32x32.png")?; let headers = response.headers(); match headers.get(CONTENT_TYPE) { None => { println!("The response does not contain a Content-Type header."); } Some(content_type) => { let content_type = Mime::from_str(content_type.to_str()?)?; let media_type = match (content_type.type_(), content_type.subtype()) { (mime::TEXT, mime::HTML) => "a HTML document", (mime::TEXT, _) => "a text document", (mime::IMAGE, mime::PNG) => "a PNG image", (mime::IMAGE, _) => "an image", _ => "neither text nor image", }; println!("The reponse contains {}.", media_type); } }; Ok(()) } # # quick_main!(run);