Волга
Главная
API Docs
GitHub
  • English
  • Русский
Главная
API Docs
GitHub
  • English
  • Русский
  • Главная
  • Основы

    • Быстрый старт
    • Параметры маршрута
    • Параметры запроса
    • Группировка маршрутов
    • Заголовки (Headers)
  • Форматы данных

    • Работа с JSON
    • Работа с Form Data
    • Работа с файлами
    • Server-Sent Events (SSE)
  • Протоколы

    • HTTP/1 and HTTP/2
    • HTTPS
    • WebSockets & WebTransport
  • Продвинутые сценарии

    • Пользовательские Middleware
    • Сжатие ответов
    • Распаковка запросов
    • Центральный обработчик ошибок
    • Внедрение Зависимостей
    • Логгирование и Трассировка
    • Статические файлы
    • CORS (Cross-Origin Resource Sharing)
    • Cookies
    • Отмена запросов
    • Пользовательская обработка методов HEAD, OPTIONS и TRACE

Работа с файлами

Волга предоставляет мощные возможности для работы с файлами, включая скачивание и загрузку файлов в ваших веб-приложениях.

Скачивание

Функция Results::file() позволяет скачивать файлы, отправляя их клиентам. Эта функция требует указания имени файла и открытого потока файла.

Использование Results::file()

Пример настройки маршрута для скачивания файлов:

use volga::{App, Results};
use tokio::fs::File;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    // GET /download
    app.map_get("/download", || async {
        let file_name = "path/to/example.txt";
        let file = File::open(file_name).await?;
        
        Results::file(file_name, file).await
    });

    app.run().await
}

Упрощение с помощью макроса file!

Волга также предоставляет макрос file!, который немного упрощает процесс.
Макрос file! предлагает чуть более читаемый синтаксис для отправки файла:

use volga::{App, file};
use tokio::fs::File;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    // GET /download
    app.map_get("/download", || async {
        let file_name = "path/to/example.txt";
        let file = File::open(file_name).await?;
        
        file!(file_name, file)
    });

    app.run().await
}

Вы можете посмотреть полный пример скачивания файлов здесь.

Загрузка файлов

Для загрузки файлов Волга предоставляет методы save() и save_as(), которые является частью volga::File. Эти методы позволяет передавать входящий поток байт непосредственно в файл на сервере, обеспечивая высокую производительность.

Пример загрузки файла

Пример настройки маршрута для обработки загрузки файлов:

use volga::{App, File};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    // POST /upload
    app.map_post("/upload", |file: File| async move {
        file.save_as("path/to/example.txt").await
    });

    app.run().await
}

Полный пример можно посмотреть здесь.

Загрузка нескольких файлов

В случае, если вам нужно загрузить несколько файлов, вы можете использовать многокомпонентную загрузку файлов. Это отдельная функция, и если вы не используете набор функций full, ее можно явно включить в Cargo.toml:

[dependencies]
volga = { version = "0.4.5", features = ["multipart"] }

Пример загрузки нескольких файлов

Пример демонстрирующий многокомпонентную загрузку файлов:

use volga::{App, Multipart};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    // POST /upload
    app.map_post("/upload", |files: Multipart| async move {
        // Сохраняет все файлы в указанной папке
        files.save_all("path/to/folder").await
    });

    app.run().await
}

Если вам нужен больший контроль или нужно выполнить какую-то работу для каждого файла, вы можете использовать метод next_field():

use volga::{App, Multipart};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    // POST /upload
    app.map_post("/upload", |files: Multipart| async move {
        let path = Path::new("path/to/folder");
        while let Some(field) = files.next_field().await? {
            // что-то делаем...

            field.save(path).await?;
        }
        ok!("Files have been uploaded!")
    });

    app.run().await
}

Больше примеров вы можете найти здесь

Last Updated:
Prev
Работа с Form Data
Next
Server-Sent Events (SSE)