Crates.io version Download LICENSE

Examples

功能:

局限性

cargo futures

一些功能默认没有开启,如需开启,请设置 cargo features

```toml [features]

默认开启 tokio tracing

default = ["tracing"]

一些类型作为 async-graphql 输入或者输出对象

async-graphql = ["dep:async-graphql"]

全部扩展

all-extensions = ["status-tracker", "speed-limiter", "speed-tracker", "breakpoint-resume", "tracing", "bson-file-archiver"]

下载状态追踪

status-tracker = ["tracing"]

下载速度追踪

speed-tracker = ["tracing"]

下载速度限制

speed-limiter = ["tracing"]

断点续传

breakpoint-resume = ["tracing"]

断点续传,文件存储器

bson-file-archiver = ["breakpoint-resume", "tracing", "serde", "bson", "url/serde"] ```

最少需要添加以下依赖

toml http-downloader = { version = "0.1" } tokio = { version = "1", features = ["rt", "macros"] } url = { version = "2" }

终端 UI

使用此库做的一个,简单的终端 UI :https://github.com/ycysdf/http-downloader-tui

用例

通过 HttpDownloaderBuilder build 函数参数去设置需要添加的扩展,需要传入一个元组,元组的成员就是扩展

在下面实例里,我传入了4 个扩展,所以 build 函数除了返回 下载器实例以外,还会返回一个4个成员的元组,这个元组包含了扩展的状态信息,

例如 DownloadSpeedTrackerExtension 扩展,就对应 DownloadSpeedTrackerState 状态

通过DownloadSpeedTrackerStatereciver 成员就可以去监听下载速度,或者通过 download_speed函数直接去获取下载速度

```rust use std::num::{NonZeroU8, NonZeroUsize}; use std::path::PathBuf; use std::time::Duration;

use anyhow::Result; use tracing::info; use url::Url;

use httpdownloader::{ breakpointresume::DownloadBreakpointResumeExtension, HttpDownloaderBuilder, speedtracker::DownloadSpeedTrackerExtension, statustracker::DownloadStatusTrackerExtension, }; use httpdownloader::bsonfilearchiver::{ArchiveFilePath, BsonFileArchiverBuilder}; use httpdownloader::speed_limiter::DownloadSpeedLimiterExtension;

[tokio::main]

async fn main() -> Result<()> { { tracing_subscriber::fmt::init(); }

let savedir = PathBuf::from("C:/download"); let testurl = Url::parse("https://releases.ubuntu.com/22.04/ubuntu-22.04.2-desktop-amd64.iso")?; let (mut downloader, (statusstate, speedstate, speedlimiter, ..)) = HttpDownloaderBuilder::new(testurl, savedir) .chunksize(NonZeroUsize::new(1024 * 1024 * 10).unwrap()) // 块大小 .downloadconnectioncount(NonZeroU8::new(3).unwrap()) .build(( // 下载状态追踪扩展 // by cargo feature "status-tracker" enable DownloadStatusTrackerExtension { log: true }, // 下载速度追踪扩展 // by cargo feature "speed-tracker" enable DownloadSpeedTrackerExtension { log: true }, // 下载速度限制扩展, // by cargo feature "speed-limiter" enable DownloadSpeedLimiterExtension::new(None), // 断点续传扩展, // by cargo feature "breakpoint-resume" enable DownloadBreakpointResumeExtension { // BsonFileArchiver by cargo feature "bson-file-archiver" enable downloadarchiverbuilder: BsonFileArchiverBuilder::new(ArchiveFilePath::Suffix("bson".tostring())) } )); info!("Prepare download,准备下载"); let downloadfuture = downloader.prepare_download().await?;

let status = statusstate.status(); // get download status, 获取状态 let statusreceiver = statusstate.statusreceiver; //status watcher,状态监听器 let bytepersecond = speedstate.downloadspeed(); // get download speed,Byte per second,获取速度,字节每秒 let _speedreceiver = speed_state.receiver; // get download speed watcher,速度监听器

// downloader.cancel() // 取消下载

// 打印下载进度 // Print download Progress tokio::spawn({ let mut downloadedlenreceiver = downloader.downloadedlenreceiver().clone(); async move { let totallen = downloader.totalsizefuture().await; if let Some(totallen) = totallen { info!("Total size: {:.2} Mb",totallen.get() as f64 / 1024f64/ 1024f64); } while downloadedlenreceiver.changed().await.isok() { let progress = *downloadedlenreceiver.borrow(); if let Some(totallen) = totallen { info!("Download Progress: {} %,{}/{}",progress*100/totallen,progress,total_len); }

          tokio::time::sleep(Duration::from_millis(1000)).await;
      }
  }

});

// 下载速度限制 // Download speed limit tokio::spawn(async move { tokio::time::sleep(Duration::fromsecs(2)).await; info!("Start speed limit,开始限速"); speedlimiter.changespeed(Some(1024 * 1024 * 2)).await; tokio::time::sleep(Duration::fromsecs(4)).await; info!("Remove the download speed limit,解除速度限制"); speedlimiter.changespeed(None).await; });

info!("Start downloading until the end,开始下载直到结束"); let dec = download_future.await?; info!("Downloading end cause: {:?}", dec); Ok(()) } ```

更多用例,请看这里:Examples