我正在尝试使用 Rust 下载图像/文件,其工作方式类似于 wget。 我按照这个https://rust-lang-nursery.github.io/rust-cookbook/web/clients/download.html#download-a-file-to-a-temporary-directory
但是没有创建临时文件,不知道为什么。如果删除临时文件夹部分,则会创建一个 png 文件,但无法读取。似乎已损坏。
如何使用 Rust 下载二进制文件?我在网上找不到好的解决方案。
找到解决方案。
使用
.bytes
而不是 .text()
,并且必须将字节包装在 std::io::Cursor
内。
由于退出时临时文件被删除,我注释掉一行以查看 cwd 中生成的图像。
let mut content = Cursor::new(response.bytes().await?);
copy(&mut content, &mut dest)?;
use error_chain::error_chain;
use std::io::copy;
use std::fs::File;
use tempfile::Builder;
use std::io::Cursor;
error_chain! {
foreign_links {
Io(std::io::Error);
HttpRequest(reqwest::Error);
}
}
#[tokio::main]
async fn main() -> Result<()> {
let tmp_dir = Builder::new().prefix("example").tempdir()?;
let target = "https://www.rust-lang.org/logos/rust-logo-512x512.png";
let response = reqwest::get(target).await?;
let mut dest = {
let fname = response
.url()
.path_segments()
.and_then(|segments| segments.last())
.and_then(|name| if name.is_empty() { None } else { Some(name) })
.unwrap_or("tmp.bin");
println!("file to download: '{}'", fname);
// let fname = tmp_dir.path().join(fname);
println!("will be located under: '{:?}'", fname);
File::create(fname)?
};
// let content = response.text().await?;
// copy(&mut content.as_bytes(), &mut dest)?;
let mut content = Cursor::new(response.bytes().await?);
copy(&mut content, &mut dest)?;
Ok(())
}