TGViewer
Flutter Friendly Flutter Friendly @flutterfriendly · 995 subscribers
Post #258 627
Всем привет, это Роза, Flutter dev Friflex!

Сегодня мы разберем, как быстро поднять и использовать собственное облачное хранилище MinIO S3.

MinIO — это полностью совместимый с S3-протоколом объектный сторедж для хранения файлов, резервных копий и больших датасетов.

MinIO поддерживает S3 API (операции GET, PUT, DELETE ), а также:
✔️Управление бакетами: Bucket policy, versioning и lifecycle rules
✔️Безопасность: шифрование на стороне сервера и клиента
✔️Поддержку Multi-user / Multi-tenant окружений
✔️Простую интеграцию с любыми S3-SDK и библиотеками

Он совместим с разными S3-инструментами, легко масштабируется благодаря архитектуре Shared-Nothing, обрабатывает запросы параллельно, использует Erasure Coding для надежности и восстановления данных, а целостность хранения обеспечивается криптографическими хэшами.

Для чего можно использовать MinIO:
▪️Приватное облако — хранение изображений и файлов пользователей
▪️AI/ML и Big Data — хранение больших наборов данных
▪️Бэкапы — резервное копирование баз данных и виртуальных машин

Использование MinIO во Flutter
Благодаря S3-совместимости, MinIO можно использовать как локальное S3 для быстрой разработки приложений на Flutter.

Для работы подходит пакет minio, совместимый с MinIO, AWS S3 и Firebase Storage.

Чтобы начать работу, достаточно создать клиент, передав данные S3-сервера:

import 'package:minio/minio.dart';

MinioClient minio = MinioClient (
  endPoint : 'your-s3-endpoint-url.com', // Замените на адрес вашего MinIO
  accessKey : 'your-access-key',        // Лучше передавать через переменные окружения (env)
  secretKey : 'your-secret-key',        // Лучше передавать через переменные окружения (env)
  useSSL : false, // Установите true, если ваш сервер S3 использует HTTPS
);


Библиотека предоставляет удобные методы для работы с объектами. Рассмотрим некоторые из них:

◽️Загрузка объекта в S3
Метод putObject позволяет загружать объекты из потока байтов (Stream<Uint8List>).

Future<AppFileLink> uploadFile({
  required String bucket,
  required String object,
  required Stream<Uint8List> data,
}) async {
  // putObject выполняет загрузку
  return minio 
    .putObject(
      bucket,
      object,
      data,
    )
    // После успешной загрузки получаем публичную ссылку
    .then((_) => getPublicUrl(bucket: bucket, object: object)); 
}

   
◽️Загрузка с прогрессом
Для больших файлов можно отслеживать ход загрузки с помощью колбэка onProgress:

await minio.putObject(
  'mybucket', 
  'myobject', 
  Stream<Uint8List>.value(Uint8List(1024)),
  onProgress: (bytes) {
    print('$bytes uploaded');
  },
);


◽️Получение временно подписанной ссылки (Presigned URL)
Для безопасного предоставления доступа к файлу без публичного доступа к бакету используется временно подписанная ссылка.

Future<AppFileLink> getPublicUrl({
  required String bucket,
  required String object,
  Duration expires = const Duration(days: 7), // Срок действия ссылки
}) async {
  final link = await minio.presignedGetObject(
    bucket,
    object,
    expires: expires.inSeconds, // Срок действия в секундах
  );
  // Возвращаем ссылку
  // ...
}


📎С полным списком методов можно ознакомиться в документации библиотеки

Продолжение — в комментариях 👇
  • 🔥 8
  • ❤ 5
  • 👍 5
More from @flutterfriendly
  1. May 14, 2026👀Какой сложный вопрос или тема по Flutter вас сейчас беспокоят? Может, задача не идет, ба…
  2. Apr 17, 2026💭Привет! Это Роза, Flutter-разработчица Friflex! Уверена, многие из вас знакомы с Dart De…
  3. Apr 8, 2026Привет, друзья! Делимся нашей страничкой на Хабре, чтобы всегда оставаться на связи. Там е…
  4. Apr 3, 2026🌸Апрель в календаре и на экране Весна зовет обновлять визуальное: убирать темные темы и в…
  5. Apr 1, 2026Всегда с нетерпением ждем этого дня, чтобы сделать подборку ИТ-мемов Пусть поводов для улы…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →