Гид по технологиям

Загрузка файлов в Firebase Storage из React

5 min read Веб-разработка Обновлено 09 Jan 2026
Загрузка файлов в Firebase Storage из React
Загрузка файлов в Firebase Storage из React

Важное: примеры кода используют модульный SDK Firebase v9+. Вставляйте свои значения конфигурации вместо плейсхолдеров.

Загрузка файлов в Firebase Storage.jpg)

Введение

Firebase Storage — это объектное облачное хранилище, удобное для пользовательского контента: изображений, видео и аудио. Оно масштабируется автоматически и интегрируется с Firebase Authentication, что позволяет контролировать доступ к файлам.

Этот материал охватывает: создание React-приложения, настройку Firebase-проекта и пример загрузки файла с отображением прогресса. Также включены рекомендации по безопасности, отладке и альтернативные подходы.

Что вам понадобится

  • Node.js и npm/yarn
  • Аккаунт Firebase (консоль Firebase)
  • Базовые знания React и JavaScript

Быстрый обзор терминов

  • Firebase Storage — облачное хранилище объектов.
  • Bucket — контейнер в Cloud Storage, где хранятся файлы.
  • Storage reference — указатель на путь в хранилище (путь к файлу).

1. Создание React проекта

Создайте простое React-приложение, например с помощью create-react-app:

npx create-react-app firebase-upload

Нам нужен только элемент input для выбора файла и кнопка загрузки. В следующих разделах покажу финальный рабочий пример App.js.

2. Создайте проект Firebase

  1. Откройте консоль Firebase и нажмите Add project / Create a project.
  2. Укажите название проекта и продолжите. Форма создания проекта Firebase с полем названия
  3. Отключите Google Analytics для тестового проекта и нажмите Create project. Отключение Google Analytics при создании проекта
  4. Когда проект создан, нажмите Continue.
  5. Зарегистрируйте веб-приложение (иконка web) и укажите псевдоним приложения. Обзор проекта в Firebase с кнопкой регистрации веб‑приложения
  6. Скопируйте объект конфигурации Firebase — он понадобится для инициализации в приложении.

3. Создайте Cloud Storage bucket

  1. В консоли проекта слева выберите Storage. Секция Storage в консоли Firebase
  2. Нажмите Get Started и выберите test mode (для разработки). Настройка Cloud Storage — выбор режима тестирования
  3. Выберите локацию по умолчанию и нажмите Done.

Примечание: в тестовом режиме правила безопасности разрешают чтение/запись всем; для продакшена обязательно ограничьте доступ.

4. Установка SDK и инициализация Firebase

Установите SDK в папке проекта:

npm install firebase

Создайте файл src/firebaseConfig.js и инициализируйте Firebase (модульный синтаксис v9+). Замените плейсхолдеры своими значениями из консоли Firebase:

import { initializeApp } from "firebase/app";
import { getStorage } from "firebase/storage";

const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  projectId: "YOUR_PROJECT_ID",
  storageBucket: "YOUR_STORAGE_BUCKET",
  messagingSenderId: "YOUR_SENDER_ID",
  appId: "YOUR_APP_ID",
  measurementId: "YOUR_MEASUREMENT_ID"
};

const app = initializeApp(firebaseConfig);
export const storage = getStorage(app);

Комментарий: использую именованный экспорт storage — так проще импортировать в компонентах.

5. Компонент React: выбор и загрузка файла

Ниже — полный пример простого App.js, который позволяет выбрать файл, показать прогресс загрузки и вывести URL загруженного файла. Тексты интерфейса в примере локализованы на русском.

import React, { useState } from "react";
import { storage } from "./firebaseConfig";
import { ref, uploadBytesResumable, getDownloadURL } from "firebase/storage";

function App() {
  const [file, setFile] = useState(null);
  const [percent, setPercent] = useState(0);
  const [downloadURL, setDownloadURL] = useState("");

  function handleChange(event) {
    setFile(event.target.files[0]);
  }

  const handleUpload = () => {
    if (!file) {
      alert("Сначала выберите файл.");
      return;
    }

    const storageRef = ref(storage, `/files/${file.name}`);
    const uploadTask = uploadBytesResumable(storageRef, file);

    uploadTask.on(
      "state_changed",
      (snapshot) => {
        const percent = Math.round((snapshot.bytesTransferred / snapshot.totalBytes) * 100);
        setPercent(percent);
      },
      (err) => {
        console.error("Ошибка загрузки:", err);
        alert("Ошибка при загрузке. Проверьте консоль.");
      },
      () => {
        getDownloadURL(uploadTask.snapshot.ref).then((url) => {
          console.log("Файл доступен по URL:", url);
          setDownloadURL(url);
        });
      }
    );
  };

  return (
    

Загрузить файл в Firebase Storage

{percent} % загружено

{downloadURL && (

Ссылка: {downloadURL}

)}
); } export default App;

Ключевые моменты:

  • uploadBytesResumable позволяет ставить на паузу/возобновлять и отслеживать прогресс.
  • getDownloadURL возвращает публичный URL к файлу (если правила доступа позволяют).
  • Путь /files/${file.name} можно заменить на структуру с id пользователя или датой, чтобы избегать конфликтов имён.

6. Улучшения и практики

6.1. Структура хранения и именование

Рекомендуется составлять пути основываясь на идентификаторах пользователей и времени:

  • files/{userId}/{timestamp}-{originalName}
  • Это помогает изолировать файлы по пользователям и избегать коллизий.

6.2. Ограничение типов и размеров

На клиенте используйте accept и проверяйте размер файла перед загрузкой. На сервере/в правилах безопасности ограничьте максимальный размер.

6.3. Асинхронная загрузка и UX

Показывайте индикатор прогресса и блокируйте повторные нажатия до завершения загрузки. Для больших файлов используйте этапы: выбор → подготовка метаданных → загрузка → подтверждение.

7. Правила безопасности (Security hardening)

По умолчанию при выборе тестового режима хранилище может быть открыто. Для продакшена настройте правила Firebase Storage:

  • Разрешайте запись/чтение только аутентифицированным пользователям.
  • Ограничьте доступ к объектам по пути: user/{userId} только для userId равного uid аутентифицированного пользователя.

Пример правила (простая идея):

service firebase.storage {
  match /b/{bucket}/o {
    match /files/{userId}/{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Важно протестировать правила в Firebase Console и покрыть кейсы: загрузка, чтение списка, удаление.

8. Отладка: частые ошибки и как их решать

  • Permission denied / access-denied — проверьте правила Storage и аутентификацию.
  • CORS ошибки — обычно не применимы к Firebase Storage при прямых запросах, но если используете прокси или Cloud Functions, настройте CORS.
  • URL не открывается — проверьте, что файл действительно загружен и правила позволяют чтение.
  • Неверный bucket — убедитесь, что storageBucket в конфигурации совпадает с вашим бакетом.

Краткий runbook при неудачной загрузке:

  1. Откройте консоль браузера и посмотрите ошибку в Network/Console.
  2. Проверяйте права доступа в Firebase Console → Storage → Rules.
  3. Убедитесь, что uid пользователя совпадает с ожидаемым в правилах.
  4. Повторите загрузку малого тестового файла.

9. Альтернативы и когда это не подходит

  • Серверная загрузка через Backend (например, Node.js + Firebase Admin SDK) — если хотите скрыть ключи, выполнять валидацию на сервере или обрабатывать файлы перед сохранением.
  • Прямые подписи URL (signed URLs) — если нужен временный публичный доступ без изменения правил.
  • Другие хранилища: S3, Azure Blob — выбирайте в зависимости от требований к цене, региону и интеграции.

Когда не использовать клиентскую загрузку:

  • Если нужно выполнять сложную обработку (транс-кодирование видео) до сохранения.
  • Если нельзя раскрывать любую логику доступа на клиенте и требуется строгий контроль на сервере.

10. Критерии приёмки

  • Файл успешно загружается и имеет корректный URL.
  • Пользователь видит прогресс загрузки.
  • Невозможно загрузить файл без выбора (показывается уведомление).
  • Правила безопасности запрещают доступ неаутентифицированным пользователям.

11. Короткая галерея кейсов (Edge cases)

  • Файлы с одинаковыми именами: используйте уникальные префиксы (userId + timestamp).
  • Прерывание сети: uploadBytesResumable поддерживает возобновление, но поведение зависит от сессии браузера.
  • Большие файлы: разбивать нет встроенной поддержки chunked в SDK, но можно использовать Cloud Functions для обработки.

12. 1‑строчный глоссарий

  • Bucket — контейнер в Cloud Storage для объектов; Storage reference — путь/указатель на объект в бакете.

13. Контрольный чеклист перед деплоем

  • Конфигурация Firebase в окружении (production vs development)
  • Обновлены правила безопасности Storage
  • Ограничен максимальный размер файлов
  • Тесты загрузки (малый/большой файл, неаутентифицированный доступ)
  • Логи и мониторинг ошибок настроены

Итог

Firebase Storage — удобное и масштабируемое решение для хранения пользовательских файлов. Клиентская загрузка через React и modular Firebase SDK даёт быстрый запуск, а правила безопасности и структурированное именование обеспечивают контроль доступа и простоту управления. Для продакшена обязательно настройте правила доступа и продумайте структуру путей для избежания коллизий имён.

Краткие рекомендации:

  • Используйте userId в путях;
  • Ограничьте права в правилах;
  • Показывайте прогресс пользователю и логируйте ошибки.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство