Почему изображения, загруженные с помощью метода Retewest .text (), повреждены? - PullRequest
0 голосов
/ 07 мая 2019

Как мне получить изображение на каком-то веб-сайте и правильно сохранить его на локальном компьютере, используя Reqwest?Я пытался использовать .text() и изображение повреждено.

Error interpreting JPEG image file (Not a JPEG file: starts with 0xef 0xbf)

Код, который я пробовал

extern crate reqwest;

use std::error::Error;
use std::fs::File;
use std::io::prelude::*;
use std::path::Path;

fn main() {
    let mut image_file = reqwest::Client::new()
        .get("https://images.pexels.com/photos/2124773/pexels-photo-2124773.jpeg")
        .send()
        .unwrap()
        .text()
        .unwrap();
    let path = Path::new("tmp/img_test.jpeg");
    let display = path.display();
    let mut file = match File::create(&path) {
        Err(why) => panic!("couldn't create {}: {}", display, why.description()),
        Ok(file) => file,
    };
    match file.write_all(image_file.as_bytes()) {
        Err(why) => panic!("couldn't write to {}: {}", display, why.description()),
        Ok(_) => println!("successfully wrote to {}", display),
    }
}

1 Ответ

5 голосов
/ 07 мая 2019

Не используйте text, который предназначен для текста и поэтому пытается декодировать необработанные байты.

Просто напишите ответ , который реализует Into<Body> где Body - это поток (который также более эффективен, чем получение байтов):

let mut client = reqwest::Client::new();
let mut image_file = client
    .get("https://images.pexels.com/photos/2124773/pexels-photo-2124773.jpeg")
    .send()
    .unwrap();

let path = Path::new("img_test.jpeg");
let display = path.display();
let mut file = match File::create(&path) {
    Err(why) => panic!("couldn't create {}: {}", display, why.description()),
    Ok(file) => file,
};
match std::io::copy(&mut image_file, &mut file) {
    Err(why) => panic!("couldn't write to {}: {}", display, why.description()),
    Ok(_) => println!("successfully wrote to {}", display),
}
...