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

Загрузка файлов — базовая функция большинства приложений: аватар, фото товара, скан документа. FlutterFlow умеет отправлять их в Firebase, Supabase или на ваш собственный сервер, а перед отправкой — сжимать, менять размер и обрабатывать.

Три способа загрузки

Отличаются они тем, куда файл попадает.

Firebase

Файл уходит прямо в Firebase Storage. После загрузки ссылка на него доступна в Widget State > Uploaded File URL — её можно показать или записать в базу.

upload-type-firebase.avif

Supabase

Файл уходит в bucket Supabase по заданному пути. Ссылка так же доступна в Widget State > Uploaded File URL.

upload-type-supabase.avif

Локальная загрузка

Файл остаётся на устройстве и доступен в Widget State > Uploaded Local File. Это промежуточный шаг: показать предпросмотр, дать отредактировать, обработать — и только потом отправить в облако.

upload-type-local-and-api.avif

Действие Upload or Save Media

Действие загружает фото или видео в Firebase, Supabase либо на ваш сервер через API. После загрузки файл доступен по ссылке — её показывают сразу или сохраняют в базу.

инфо
Что нужно для Firebase
  1. Firebase подключён к проекту — см. инструкцию.
  2. Настроена аутентификация Firebase.
  3. Настроен Firebase Storage.
  4. Есть хотя бы одна коллекция, куда записать полученную ссылку.
инфо
Что нужно для Supabase
  1. Подключите Supabase к приложению.
  2. Создайте bucket. По умолчанию он закрытый — без авторизации файлы недоступны. Публичным его делать можно, но не для чувствительного содержимого.

supabase-storage-bucket.png

  1. Задайте правила доступа. Пример: для структуры вида pics/uploads так настраивается политика, разрешающая загружать аватар только авторизованным пользователям.

Добавьте действие Upload/Save Media на виджет, с которого пользователь начинает загрузку, и задайте Upload Type. В разделе Media Type/Source выберите, что загружается — фото, видео или и то и другое, — а в списке Media Source укажите источник:

  • Camera — снять на камеру.
  • Gallery — выбрать из галереи.
  • Either Camera or Gallery — спросить у пользователя: откроется нижняя панель с обоими вариантами.

Как показать загруженное — в следующем разделе.

инфо

При Upload Type:

Настройки самого действия:

configure-upload-media-action.avif

  • Max Width и Max Height — предельные размеры фотографии. Картинка уменьшается с сохранением пропорций. Задавать их стоит почти всегда: снимок с современного телефона весит несколько мегабайт, и хранить его в исходном разрешении под аватар бессмысленно.
  • Image Quality — качество от 0 до 100; 100 оставляет исходное.
  • Include Media Dimensions — получить ширину и высоту загруженного файла. Операция затратная, включайте только если размеры действительно нужны.
  • Include Blur Hash — сгенерировать BlurHash, чтобы показывать размытую заглушку, пока грузится оригинал. Подробнее — в разделе про BlurHash.
  • Source Picker Style — оформление нижней панели выбора источника.
  • Allow Multiple Images — разрешить выбрать несколько картинок; требует Media Source = Gallery. Ссылки на них берутся из Set from Variable menu > Widget State > Uploaded File URLs (List<String>).
  • Show Snackbar — показывать ход загрузки снекбаром.

Подробный видеоразбор действия:

Обработка файла перед отправкой

С Upload Type = Local Upload файл сначала сохраняется на устройстве в виде байтов — его можно показать, изменить или обработать до отправки в облако.

Что это даёт:

  • Предпросмотр и проверка. Пользователь видит, что именно отправляет, и может отказаться.

  • Редактирование. В соцсетях фото для поста правят и накладывают фильтры до публикации, а в облако уходит уже готовый кадр.

  • Обработка данных. В сканерах документов снимок распознаётся текстом, выправляется по контрасту или превращается в PDF — и только потом загружается.

  • Работа без сети. Файл лежит на устройстве, пока не появится интернет.

  • Свой сервер. Файл отправляется вызовом API; ссылку, которую вернёт сервер, нужно сохранить в базе, если содержимое потом показывается.

Ниже — три типичных сценария.

1. Загрузка на свой сервер через API

Добавьте Upload/Save Media с типом Local Upload (Widget State), следующим действием — API call с вызовом, который отправляет файл. Сервер должен вернуть ссылку на загруженный файл; её сохраняют в базу или используют, чтобы показать картинку.

инфо

Тело запроса должно быть в формате Multipart — см. настройку multipart-запроса.

2. Сжатие картинки собственным действием

Сначала Upload/Save Media с типом Local Upload (Widget State) — файл ложится на устройство.

Дальше собственное действие (например, compressImageAction) принимает этот файл, сжимает его по байтам и возвращает результат. Сжатый файл отправляется в облако вторым действием Upload/Save Media.

compress-image

3. Загрузка в Firebase или Supabase после обработки

Первое действие — Upload/Save Media с типом Local Upload (Widget State). После обработки добавьте второе: Upload TypeFirebase или Supabase, File TypeUploaded File, File to UploadWidget State > Uploaded Local File.

local-upload-to-firebase-supabase

Действие Upload or Save File

Для файлов любого типа — PDF, MP3 и прочих — есть отдельное действие. Настраивается оно почти так же, как Upload or Save Media.

инфо
PDF в вебе

Для веб-версии приложения и проверки загрузки PDF в Run Mode нужна дополнительная настройка — см. доступ из веба.

перевод официальной документации FlutterFlow

обновлено

ESC