Як додати завантаження файлів до застосунку: сховище, ліміти та безпека
Щоб додати завантаження файлів до застосунку, зберігайте файли в об'єктному сховищі (bucket), а не на диску сервера й не в базі даних, а в базі даних зберігайте невеликий запис із ключем файлу, назвою, розміром, типом і власником. Перевіряйте розмір і тип файлу на сервері, заздалегідь вирішіть, чи файли публічні (як фото товарів) чи приватні (як рахунки), і віддавайте приватні файли лише після перевірки того, хто їх запитує. У конструкторі застосунків на базі ШІ можна описати функцію завантаження одним промптом; важливо протестувати, що файли переживають повторне розгортання і їх не може відкрити не той користувач.
Визначте, які завантаження вам потрібні
Перед створенням відповідьте на три запитання:
- Які файли? Фото профілю, зображення товарів, PDF, таблиці, аудіо, відео. Від цього залежать обмеження типу та розміру.
- Хто їх може бачити? Усі (публічна галерея) або лише той, хто завантажив, та адміністратори (контракти, документи, що посвідчують особу, файли клієнтів).
- Що відбувається після завантаження? Просто зберегти, показати попередній перегляд, змінити розмір зображень чи прочитати вміст.
Публічні зображення та приватні документи потребують різних налаштувань, тож спершу визначте це.
Де мають зберігатися файли
| Варіант | Як працює | Для чого добре | На що звернути увагу |
|---|---|---|---|
| Об'єктне сховище (bucket) | Файли зберігаються в сервісі, створеному для цього; база даних зберігає ключ або URL | Майже будь-який застосунок | Правила доступу мають бути налаштовані правильно |
| Сховище від платформи | Конструктор застосунків або хостинг вмикає для вас bucket | Застосунки на цій платформі | Ліміти та ціни визначаються платформою |
| Диск сервера | Файли записуються у файлову систему сервера застосунку | Лише локальна розробка | Часто очищується під час перезапуску або повторного розгортання |
| У базі даних | Байти файлу зберігаються в таблиці | Майже ніколи | Роздуває базу даних, сповільнює резервне копіювання |
| Сторонній віджет завантаження | Хостинговий сервіс обробляє весь процес | Важкі медіа, трансформації зображень | Ще один постачальник, обліковий запис і рахунок |
Для більшості застосунків правильна відповідь — об'єктне сховище плюс запис у базі даних. Рядок у базі даних — це те, що запитує ваш застосунок («покажи документи цього користувача»); bucket лише тримає самі байти.
Публічні та приватні файли
- Публічні файли (фото товарів, зображення для блогу, аватари) можна віддавати з публічного URL. Будь-хто з посиланням може їх відкрити, і для такого контенту це нормально.
- Приватні файли (рахунки, контракти, медичні чи документи, що посвідчують особу, результати роботи для клієнтів) ніколи не повинні мати публічного URL, який можна вгадати. Сервер перевіряє, що користувач, який увійшов, є власником файлу або має дозвіл, а потім або передає файл, або повертає підписане посилання: посилання, що працює лише короткий час.
Поширена та серйозна помилка — приватні файли в публічному bucket із передбачуваними назвами. Той, хто вгадає /uploads/invoice-102.pdf, отримає чужий рахунок.
Приклади промптів
Публічне завантаження зображень:
Дозволь адміністраторам завантажувати до 5 фото товару на кожен товар. Приймай JPG, PNG і WebP до 5 МБ кожне. Зберігай файли у файловому сховищі, записуй ключ, розмір і порядок кожного файлу в таблицю product_images і показуй мініатюри з кнопкою видалення. Перевіряй тип і розмір на сервері, а не лише в браузері.
Завантаження приватного документа:
Додай сторінку Documents для клієнтів, які увійшли. Клієнти можуть завантажувати PDF до 20 МБ. Файли приватні: зберігай їх у файловому сховищі, записуй ID власника, оригінальну назву файлу, розмір і час завантаження в таблицю documents, і дозволяй завантажувати їх лише власнику та адміністраторам. Завантаження йде через серверний маршрут, який перевіряє дозвіл. Ніколи не відкривай публічний URL для цих файлів.
Корисні доповнення:
Показуй індикатор прогресу під час завантаження та чітку помилку, якщо файл завеликий або неправильного типу.
Коли рядок документа видаляється, видаляй і збережений файл.
Крок за кроком
- Визначте типи та ліміти розміру для кожного поля завантаження. Будьте конкретними: «PDF до 20 МБ», а не «документи».
- Увімкніть сховище. У конструкторі на базі ШІ попросіть про завантаження — він налаштує сховище; в інших місцях створіть bucket і додайте його облікові дані як секрети на сервері.
- Створіть таблицю в базі даних для записів про файли: ID, власник, ключ сховища, початкова назва, тип, розмір, час створення.
- Побудуйте маршрут завантаження на сервері: перевірте, що користувач увійшов, перевірте тип і розмір, згенеруйте безпечний ключ сховища (а не ім'я файлу користувача), збережіть файл, вставте запис.
- Побудуйте шлях завантаження або показу: публічний URL для публічних файлів; маршрут із перевіркою дозволу або підписане посилання для приватних.
- Побудуйте інтерфейс: вибір файлу, за потреби перетягування, прогрес, попередній перегляд, помилки.
- Обробляйте видалення, щоб видалення запису також видаляло збережений файл.
- Тестуйте: завантажте, перезавантажте сторінку, повторно розгорніть або опублікуйте й перевірте, що файл досі відкривається. Потім увійдіть як інший користувач і спробуйте відкрити приватний файл першого.
Типові помилки
- Запис завантажень на диск сервера. Працює в розробці, а потім файли зникають після перезапуску або повторного розгортання.
- Довіра до перевірок браузера. Налаштування «accept» у полі вибору файлу — це підказка, а не безпека. Перевіряйте тип і розмір на сервері.
- Використання імені файлу користувача як ключа сховища. Назви збігаються і можуть містити дивні символи. Генеруйте унікальний ключ, а оригінальну назву зберігайте окремо.
- Публічні bucket для приватних файлів. Див. вище; саме ця помилка потрапляє в новини.
- Дозвіл будь-яких типів файлів. HTML або SVG, що віддаються з вашого домену, у деяких налаштуваннях можуть запускати скрипти. Приймайте лише потрібні типи.
- Немає ліміту розміру. Одне величезне завантаження може з'їсти ліміт сховища або викликати тайм-аут запиту.
- Осиротілі файли. Видалення рядка в базі даних без видалення файлу поступово заповнює сховище, за яке ви платите.
- Забуті мобільні пристрої. Фото з телефона можуть бути великими та в форматах на кшталт HEIC; вирішіть, приймати їх чи конвертувати.
Контрольний список
- Файли йдуть в об'єктне сховище, а не на диск сервера чи в базу даних
- Кожен файл має запис у базі даних із власником, ключем, назвою, типом і розміром
- Тип і розмір перевіряються на сервері
- Ключі сховища генеруються, а не беруться з імені файлу
- Приватні файли віддаються лише після перевірки дозволу
- Інший користувач не може відкрити ваші приватні файли, навіть за посиланням
- Видалення запису видаляє файл
- Файли досі відкриваються після публікації або повторного розгортання
- Помилки завантаження показуються чітко, зокрема на телефоні
Завантаження файлів у Mythex
Mythex може автоматично ввімкнути файлове сховище для проєкту, коли вашому застосунку потрібні завантаження, тож bucket не доводиться налаштовувати вручну. Також можна ввести /storage у чаті. Воно доступне на Free і Pro, з обмеженням 1 ГБ на Free, а його статус видно в Settings → Storage.
Документація прямо каже, що опублікований хостинг не є постійною локальною файловою системою, тож просіть агента використовувати сховище платформи, а не зберігати на диск. Збережені файли та завантаження оплачуються з вашого балансу кредитів за розміром і за обсягом завантажень; на Pro ціна вдвічі нижча, ніж на Free. Див. File storage у документації.
Завантаження зазвичай йдуть разом з базою даних для записів про файли та входом для приватних файлів. Якщо ви створюєте місце, де клієнти обмінюються документами, див. як створити клієнтський портал, а перед запуском пройдіть контрольний список безпеки.
Запитання
Де слід зберігати завантажені файли?
В об'єктному сховищі (сервісі, створеному для файлів, який часто називають bucket), а не на диску сервера застосунку й не всередині бази даних. У базі даних зберігайте лише ключ або URL файлу, а також такі відомості, як назва, розмір і власник.
Чому мої завантажені файли зникають після публікації або повторного розгортання?
Більшість хостингових платформ не має постійного локального диска: коли застосунок перезапускається або розгортається знову, файли, записані на його диск, губляться. Зберігайте завантаження в об'єктному сховищі.
Як зберегти завантажені файли приватними?
Не робіть файли публічно доступними для читання. Нехай ваш сервер перевіряє, що користувач, який увійшов, має право бачити файл, а потім надсилає його або повертає посилання з коротким терміном дії.
Чи підтримує Mythex завантаження файлів?
Так. Mythex може ввімкнути файлове сховище для проєкту, коли застосунку потрібні завантаження, на тарифах Free і Pro, з обмеженням 1 ГБ на Free. Ви просите агента про функцію завантаження або вводите /storage.