我试图下载图像/文件与 rust ,工程像一个wget.我跟随这个https://rust-lang-nursery.github.io/rust-cookbook/web/clients/download.html#download-a-file-to-a-temporary-directory但是一个临时文件没有被创建,不知道为什么。如果你删除临时文件夹部分,一个png文件被创建,但不能被读取。似乎损坏。我如何下载一个二进制文件与生 rust ?我找不到一个很好的解决方案在线。
qxsslcnc1#
找到解决办法了。使用.bytes代替.text(),并且必须将字节 Package 在std::io::Cursor内。由于临时文件在退出时被删除,我注解掉一行以查看cwd中的结果图像。
.bytes
.text()
std::io::Cursor
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(()) }
1条答案
按热度按时间qxsslcnc1#
找到解决办法了。
使用
.bytes
代替.text()
,并且必须将字节 Package 在std::io::Cursor
内。由于临时文件在退出时被删除,我注解掉一行以查看cwd中的结果图像。
完整解决方案