下载带有 Rust 的图像失败(图像已损坏)

问题描述 投票:0回答:1

我正在尝试使用 Rust 下载图像/文件,其工作方式类似于 wget。 我按照这个https://rust-lang-nursery.github.io/rust-cookbook/web/clients/download.html#download-a-file-to-a-temporary-directory

但是没有创建临时文件,不知道为什么。如果删除临时文件夹部分,则会创建一个 png 文件,但无法读取。似乎已损坏。

如何使用 Rust 下载二进制文件?我在网上找不到好的解决方案。

image rust download
1个回答
0
投票

找到解决方案。

使用

.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(())
}

© www.soinside.com 2019 - 2024. All rights reserved.