docx_template/
request.rs

1use crate::error::DocxError;
2use crate::image::get_extension;
3use reqwest::Client;
4
5/// 获取图片数据   
6/// @param client 请求客户端  
7/// @param url 图片url路径  
8/// @return (data, ext) 返回 Vec<u8>和图片扩展名  
9pub async fn request_image_data(
10    client: &Client,
11    url: &str,
12) -> Result<(Vec<u8>, String), DocxError> {
13    // 发送请求
14    let response = client.get(url).send().await?;
15    // 检查状态码
16    if !response.status().is_success() {
17        return Err(DocxError::NotImage("请求图片错误".to_string()));
18    }
19    // 获取请求头
20    let headers = response.headers().clone();
21    // 先读取头信息
22    let content_type = headers
23        .get(reqwest::header::CONTENT_TYPE)
24        .map(|h| h.to_str().unwrap_or(""))
25        .unwrap_or("");
26    // 获取内容类型以验证是否为图片
27    let extension = if !content_type.starts_with("image/") {
28        get_extension(url)?
29    } else {
30        &content_type[6..]
31    };
32    // 读取字节
33    let image_data = response.bytes().await?.to_vec();
34    Ok((image_data, extension.to_string()))
35}