@ZERRITO
Пустой ноль

Как скачать файл по прямой ссылке?

Здравствуйте. Я изучаю Rust около недели, потому что один Python мне изрядно поднадоел. Решил открыть для себя что-то новое. Итак, посмотрел сами основы, вроде бы ничего необычного, но потом я захотел сделать то, что делал на Python. А именно с самого начала я всегда пытался сделать что-то достаточно сложное. И вот я добрался до скачиваний файла.

По сути, скачивание файла — это ведь получение байтов? И если в Python это можно сделать запросом с помощью одной библиотеки, после чего записать всё в файл, то и в Расте можно. Так ведь?

Я переглянул туториалы и примеры на эту тему, но так толком ничего и не понял. Сначала функция main() не может быть асинхронной, потом Result is a type that represents either success (Ok) or failure (Err). Пытался получить данные с помощью reqwest::get() и hyper, но всегда возникала проблема с асинхронностью и записью данных (которые я не мог получить) в файл.

Даже если всё вроде бы нормально, всё равно что-то пойдёт не так.
485 | pub enum Result<T, E> {
    |          ^^^^^^ -  -
help: add missing generic argument
    |
6   | async fn main() -> Result<(), E> {

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

#[tokio::main]
async fn main() -> Result<()> {
    let target = "https://www.rust-lang.org/static/images/rust-logo-blk.svg";
    let response = reqwest::get(target).await?;

    let path = Path::new("C:/Users/polzo/Desktop/image.svg");

    let mut file = match File::create(&path) {
        Err(why) => panic!("couldn't create {}", why),
        Ok(file) => file,
    };
    let content =  response.text().await?;
    file.write_all(content.as_bytes())?;
    Ok(())
}

(Скопировал с примера в интернете)

Каким способом это можно сделать, чтобы даже новичку более-менее было, о чём идёт речь?
  • Вопрос задан
  • 451 просмотр
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka
Токсичный шарпист
Хз что именно было не так (подозреваю 'add missing generic argument')
Но вот это работает:
use std::{fs::OpenOptions, io::Write, path::Path};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let target = "https://www.rust-lang.org/static/images/rust-logo-blk.svg";
    let response = reqwest::get(target).await?;

    let path = Path::new("./image.svg");
    let mut file = OpenOptions::new().create(true).write(true).open(path)?;
    let content = response.text().await?;
    file.write_all(content.as_bytes())?; // Хочу асинхронно писать в файлы. Как это можно сделать?
    Ok(())
}

Пример брал из документации reqwest
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы