一般網頁瀏覽器在開啟一些常用文件、圖片、影片等格式時,會直接在網頁瀏覽器上進行瀏覽或是播放,但有時候我們會希望使用者可以在點擊網頁連結之後,無論該連結的資源是什麼類型的檔案,使網頁瀏覽器都會跳出下載的視窗。



Download Response for Rocket Framework

「Download Response for Rocket Framework」是筆者開發的套件,可以使Rocket框架直接回應一個Vec<u8>實體、一個Reader或是一個檔案,並且可以讓網頁瀏覽器在連結的時候直接跳出下載視窗。

Crates.io

https://crates.io/crates/rocket-client-addr

Cargo.toml

rocket-client-addr = "*"

使用方法

rocket_download_response這個crate提供的DownloadResponse結構體可以當作要回應的資料型別。DownloadResponse結構體提供了from_vec關聯函數,可以從參數中傳入要拿來回應的Vec<u8>實體、檔案類型和下載時預設的檔案名稱(如果不設定檔案名稱的話,網頁瀏覽器會用網址路徑的檔案名稱來當作檔案名稱)。它也提供了from_reader關聯函數,可以從參數中傳入任意有實作Read特性的實體、檔案類型和下載時預設的檔案名稱。

如果資料來源為檔案的話,那就更方便了,可以直接使用DownloadResponse結構體提供的from_file關聯函數,可以從參數中傳入檔案路徑、檔案類型和下載時預設的檔案名稱。如果不提供檔案類型的話,預設會由檔案路徑中的副檔名來判斷;如果不提供檔案名稱的話,預設會由檔案路徑中的檔案名稱來判斷;如果想要直接使用網址路徑的檔案名稱作為預設的檔案名稱的話,那就把檔案名稱設定為空字串。

舉個例子,假設工作目錄中有image.jpg這張JPEG圖檔。若想要讓Rocket框架提供這個圖檔,並且讓網頁瀏覽器不直接瀏覽這個圖檔,而是將其下載到檔案系統的話,程式可以這樣寫:

#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use]
extern crate rocket;

extern crate rocket_download_response;

use std::path::Path;

use rocket_download_response::DownloadResponse;

#[get("/")]
fn download() -> DownloadResponse {
    let path = Path::new("image.jpg");

    DownloadResponse::from_file(path, None::<String>, None)
}

fn main() {
    rocket::ignite().mount("/", routes![download]).launch();
}