国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Rust 自建HTTP Server支持圖片響應(yīng)

這篇具有很好參考價值的文章主要介紹了Rust 自建HTTP Server支持圖片響應(yīng)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本博客是在楊旭老師的 rust web 全棧教程項目基礎(chǔ)上進行修改,支持了圖片資源返回,楊旭老師的rust web鏈接如下:

https://www.bilibili.com/video/BV1RP4y1G7KFp=1&vd_source=8595fbbf160cc11a0cc07cadacf22951

本人默認(rèn)讀者已經(jīng)學(xué)習(xí)了相關(guān)基礎(chǔ)教程和楊旭老師的相關(guān)課程,直接開始針對項目里面對應(yīng)文件進行修改說明。

一、新增加載圖片資源方法

在原先項目加載文件方法同一層,新增支持加載圖片資源如下。

pub trait Handler{
    fn handle(res:&HttpRequest) ->HttpResponse;
    fn load_file(file_name:&str) ->Option<Vec<u8>>{
        println!("load_file file_name={}",file_name);
        let default_path = format!("{}/public",env!("CARGO_MANIFEST_DIR"));
        println!("load_file default_path={}",default_path);
        let public_path = env::var("PUBLIC_PATH").unwrap_or(default_path);
        let full_path = format!("{}/{}",public_path,file_name);
        println!("load_file full_path={}",full_path);
        let contents = fs::read(full_path);
        contents.ok()
    }

    fn load_image(image_name:&str) ->Option<Vec<u8>>{
        let default_path = format!("{}/public",env!("CARGO_MANIFEST_DIR"));
        let public_path = env::var("PUBLIC_PATH").unwrap_or(default_path);
        let full_path = format!("{}/{}/{}",public_path,"image",image_name);
        println!("load_image full_path={}",full_path);
        let contents: Result<Vec<u8>, std::io::Error> = fs::read(full_path);
        contents.ok()
    }
}

load_image 方法就是本博客新增方法,根據(jù)入?yún)D片名稱,去指定public目錄下image文件夾下讀取圖片文件,返回Vec<u8> 字節(jié)流。

我們在舊的新增了圖片處理分支如下

impl Handler for StaticPageHandler{
    fn handle(req:&HttpRequest) ->HttpResponse{
        let http::httprequest::Resource::Path(s) =&req.resourece;
        let route:Vec<&str> = s.split("/").collect();
        println!("route={}",route[1]);
        if route[1]=="image" {
           match Self::load_image(route[2]){
               Some(content) => {
                let mut map:HashMap<&str,&str> = HashMap::new();
                map.insert("Content-Type","image/webp");
                println!("讀取到文件長度{}",content.len());
                return HttpResponse::new("200",Some(map),Some(content));
               },
               None => {
                return HttpResponse::new("404",None,Self::load_file("404.html"))
               }
           }
        }match route[1] {
            "" =>HttpResponse::new("200",None,Self::load_file("index.html")),
            "health" =>HttpResponse::new("200",None,Self::load_file("health.html")),
            path => match Self::load_file(path) {
                Some(contents) =>{
                    let mut map:HashMap<&str,&str> = HashMap::new();
                    if path.ends_with(".css") {
                        map.insert("Content-Type","text/css");
                    }else if path.ends_with(".js") {
                        map.insert("Content-Type","text/javascript");
                    }else {
                        map.insert("Content-Type","text/html");
                    }
                    HttpResponse::new("200",Some(map),Some(contents))
                },
                None => HttpResponse::new("404",None,Self::load_file("404.html"))
            }
        }
    }
}

特別說明點根據(jù)加載圖片類型不同,map.insert("Content-Type","image/webp");

這里的Content-Type也要對應(yīng)修改,我這里返回的文件是webp格式。

二、修改HttpResponse 結(jié)構(gòu)體body數(shù)據(jù)類型

舊項目中由于返回的都是文本內(nèi)容,body數(shù)據(jù)類型定義成字符串切片,由于這次改動讀取圖片是字節(jié)流,所以這里的body也需要變更成Option<Vec<u8>>類型

#[derive(Debug,PartialEq,Clone)]
pub struct HttpResponse<'a>{
    version:&'a str,
    status_code:&'a str,
    status_text:&'a str,
    header:Option<HashMap<&'a str,&'a str>>,
    body:Option<Vec<u8>>,
}

三、修改HttpResponse 響應(yīng)方法

上面已經(jīng)提到了,舊項目返回的是文本內(nèi)容,故在發(fā)送HttpResponse數(shù)據(jù)是,直接將數(shù)據(jù)轉(zhuǎn)化成字符串發(fā)送。這里我們?yōu)榱思嫒輬D片資源的響應(yīng),所以body為Vec<u8>類型時就不適用先前的方法。我們對除了body字段,其他字段依然按照舊的邏輯轉(zhuǎn)化成字符串。

impl <'a> From<HttpResponse<'a>> for String{
  fn from(res:HttpResponse) -> String{
    let res1 = res.clone();
    format!("{} {} {}\r\n{}Content-Length:{}\r\n\r\n",
      &res1.version(),
      &res1.status_code(),
      &res1.status_text(),
      &res1.header(),
      &res.body.unwrap().len(),
    )
  }
}

?相比較舊的方法,我們?nèi)サ袅薭ody參數(shù)。

四、返回body數(shù)據(jù)

上面講過了,我們在響應(yīng)轉(zhuǎn)String時,將body數(shù)據(jù)拆分出來了,那么通過什么方法返回body數(shù)據(jù)。

    pub fn send_response(&self, write_stream:&mut impl Write) -> Result<(),std::io::Error>{
        let res = self.clone();
        let response_string: String = String::from(res); // from trait
        write_stream.write(response_string.as_bytes()).unwrap();
        write_stream.write(&self.body()).unwrap();
        write_stream.flush().unwrap();
    
        Ok(())
    }

?我們就是通過write_stream.write(&self.body()).unwrap();將body數(shù)據(jù)再獨立發(fā)送一下。

整理上來講改動很小,就是將body數(shù)據(jù)類型從&str,改成了Vec<u8>,在發(fā)送響應(yīng)時將body拆分出來發(fā)送。文章來源地址http://www.zghlxwxcb.cn/news/detail-498021.html

到了這里,關(guān)于Rust 自建HTTP Server支持圖片響應(yīng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 第1章. 為什么要自建博客

    博客,僅音譯,英文名為 Blogger ,為Web Log的混成詞。它的正式名稱為網(wǎng)絡(luò)日記;又音譯為部落格或部落閣等,是使用特定的軟件,在網(wǎng)絡(luò)上出版、發(fā)表和張貼個人文章的人,或者是一種通常由個人管理、不定期張貼新的文章的網(wǎng)站。它是一種網(wǎng)絡(luò)交流方式,是網(wǎng)絡(luò)時代的個人

    2023年04月25日
    瀏覽(11)
  • 前端本地原生開發(fā)好用的 http server 服務(wù)(npm 包形式、支持熱更新、簡單好用)

    有時候在本地原生網(wǎng)頁開發(fā)的時候,需要起一個服務(wù)能夠直接訪問當(dāng)現(xiàn)在正在開發(fā) index.html 等內(nèi)容,也就是希望通過 npm 包在進入項目文件夾后,直接可以起一個 可訪問的 http 鏈接 ,不希望在去安裝 nginx 。 下面例舉幾個: serve:為本地靜態(tài)頁面創(chuàng)建一個可訪問的服務(wù),不支

    2024年02月04日
    瀏覽(21)
  • 基于 ESP32 創(chuàng)建 HTTP Server 服務(wù)器,支持載入文件到服務(wù)器,并對載入文件進行刪除管理

    基于 ESP32 創(chuàng)建 HTTP Server 服務(wù)器,支持載入文件到服務(wù)器,并對載入文件進行刪除管理

    軟件編程指南參見:HTTP 服務(wù)器 任意一款 ESP32 系列開發(fā)板 2.4GHz 路由器熱點 準(zhǔn)備各種格式的文件 可基于 esp-idf/examples/protocols/http_server /file_serving 例程進行測試 只需要設(shè)置 ESP32 連接的 2.4GHz 的 WiFi 熱點 即可 menuconfig — Example Connection Configuration — WiFi SSID — WiFi Password 下載固件

    2024年02月16日
    瀏覽(34)
  • SQL Server(解決問題)已成功與服務(wù)器建立連接,但是在登錄過程中發(fā)生錯誤

    SQL Server(解決問題)已成功與服務(wù)器建立連接,但是在登錄過程中發(fā)生錯誤

    SQL Server(解決問題)已成功與服務(wù)器建立連接,但是在登錄過程中發(fā)生錯誤。provider: Shared Memory Provider, error:0 - 管道的另一端上無任何進程。我們將 身份驗證 選擇為 SQL Server 身份驗證。輸入剛剛創(chuàng)建的用戶名和密碼: 但是現(xiàn)在還是不能直接使用,因為權(quán)限問題。你會看到下

    2024年02月06日
    瀏覽(25)
  • SQL Server :已成功與服務(wù)器建立連接,但是在登錄前的握手期間發(fā)生錯誤。

    SQL Server :已成功與服務(wù)器建立連接,但是在登錄前的握手期間發(fā)生錯誤。

    學(xué)習(xí)sqlserver的時候,默認(rèn)的身份驗證是windows的身份驗證。 而在進一步學(xué)習(xí)的時候希望改成sqlserver的身份驗證。操作流程無非就是選中服務(wù)器——》右擊屬性 再按如下圖選擇,當(dāng)然sqlserver有默認(rèn)的身份驗證賬號,sa,操作教程也有,這里不談。我也是按如此操作的 當(dāng)然我畫蛇

    2024年02月07日
    瀏覽(15)
  • 微信小程序post傳遞參數(shù)為formData格式,一般是在上傳圖片時需要的

    wx.uploadFile傳參的格式本身就是formData格式的,參照官網(wǎng)就可以 如果是wx.request的需要formData格式,如下圖data的格式

    2024年02月13日
    瀏覽(22)
  • 【uniapp】微信小程序,取視頻第一幀,前提是 圖片是在 阿里云的oss上

    【uniapp】微信小程序,取視頻第一幀,前提是 圖片是在 阿里云的oss上

    上傳視頻等,默認(rèn)為黑色,無法用視頻的第一幀作為封面,以及視頻的video為原生組件,層級很高無法覆蓋問題,雖然有cover-view,但很多場景還是不靈活 自己服務(wù)器是不支持的 ,可以用canvas截圖 方法 ,將 圖片組件image 替換成 視頻video 組件 視頻組件video 重點 將video組件更換

    2024年02月08日
    瀏覽(40)
  • 幻獸帕魯:自建多人聯(lián)機服務(wù)器,支持32人聯(lián)機

    幻獸帕魯:自建多人聯(lián)機服務(wù)器,支持32人聯(lián)機

    ?Steam游戲《幻獸帕魯》是新上線的一款開服世界生存制作游戲,上線短短5天時間,就賣出了700萬份,同時在線人數(shù)最高達到180萬人,創(chuàng)下了Steam歷史榜單第二名的好成績。預(yù)期之外的爆火使幻獸帕魯官方服務(wù)器正面臨大量玩家涌入而導(dǎo)致的服務(wù)器網(wǎng)絡(luò)擁堵問題,很多玩家反饋

    2024年02月20日
    瀏覽(28)
  • windows自建免費無限的開源圖片識別公式轉(zhuǎn)換為Latex

    windows自建免費無限的開源圖片識別公式轉(zhuǎn)換為Latex

    python3.9.6下載 在最開始勾選添加環(huán)境變量 https://www.python.org/ftp/python/3.9.6/python-3.9.6-amd64.exe 驗證,右鍵終端(管理員),輸入:python --version 安裝Anaconda https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-5.3.1-Windows-x86_64.exe 運行安裝包,一路默認(rèn)路徑就ok 配置環(huán)境變量 ,主要添加\\\"C:Pr

    2023年04月16日
    瀏覽(21)
  • (自適應(yīng)手機端)響應(yīng)式新聞博客知識類pbootcms網(wǎng)站模板 自媒體運營博客網(wǎng)站源碼下載

    (自適應(yīng)手機端)響應(yīng)式新聞博客知識類pbootcms網(wǎng)站模板 自媒體運營博客網(wǎng)站源碼下載

    (自適應(yīng)手機端)響應(yīng)式新聞博客知識類pbootcms網(wǎng)站模板 自媒體運營博客網(wǎng)站源碼下載 帶后臺系統(tǒng)PbootCMS內(nèi)核開發(fā)的網(wǎng)站模板,該模板適用于新聞博客網(wǎng)站、自媒體運營網(wǎng)站等企業(yè),當(dāng)然其他行業(yè)也可以做,只需要把文字圖片換成其他行業(yè)的即可; 自適應(yīng)手機端,同一個后臺,

    2024年02月05日
    瀏覽(94)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包