下载生 rust 的图像失败(图像损坏)

s2j5cfk0  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(173)

我试图下载图像/文件与 rust ,工程像一个wget.我跟随这个https://rust-lang-nursery.github.io/rust-cookbook/web/clients/download.html#download-a-file-to-a-temporary-directory
但是一个临时文件没有被创建,不知道为什么。如果你删除临时文件夹部分,一个png文件被创建,但不能被读取。似乎损坏。
我如何下载一个二进制文件与生 rust ?我找不到一个很好的解决方案在线。

qxsslcnc

qxsslcnc1#

找到解决办法了。
使用.bytes代替.text(),并且必须将字节 Package 在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(())
}

相关问题