Блог
Загрузка файлов на статическом сайте: реальные варианты
· 3 мин чтения
С текстовыми полями всё просто - сложный вопрос возникает, когда в брифе написано «а соискатели должны прикрепить резюме». Статический сайт не может принять файл: принимать его попросту нечему. Вот реальные варианты, от худшего к лучшему.
Вариант 1: «пришлите нам на почту» (капитуляция)
Попросите пользователей присылать вложения по электронной почте. Технически это работает - как работает факс: файл приходит в почтовый ящик в отрыве от данных формы, без структуры и без контроля размера. Для всего повторяющегося - заявок на работу, вложений в обращениях поддержки, файлов для печати - это превращается в вечную ручную раскладку по папкам.
Вариант 2: загрузка напрямую в облачное хранилище (DIY-путь)
Фронтенд-JavaScript может загружать файлы напрямую в объектное хранилище (подписанные URL в стиле S3). Это законная архитектура - и неожиданно большой объём работы, чтобы сделать это безопасно: что-то должно генерировать эти подписанные URL (то есть вы всё равно пишете serverless-функцию), вы сами реализуете проверку размера и типа, связываете загруженный файл с той отправкой формы, которой он принадлежит, и решаете, в какой точке мира находится этот bucket - а это важно, как только в загрузках оказываются персональные данные вроде резюме.
Выбирайте этот путь, если загрузки - это ваш продукт. Для задачи «прикрепить файл к форме» это очень много сантехники.
Вариант 3: multipart через бэкенд форм (скучный, но правильный)
HTML поддерживает поля для файлов примерно вечно:
<form action="https://formhook.app/f/fh_your-key"
method="POST" enctype="multipart/form-data">
<input type="email" name="email" required>
<textarea name="message" required></textarea>
<input type="file" name="attachment">
<button type="submit">Send</button>
</form>Единственное, что все забывают, - это enctype="multipart/form-data": без него браузер отправляет имя файла вместо самого файла. Когда POST принимает бэкенд форм, файл сохраняется вместе со своей отправкой: откройте обращение в панели - вложение прямо там. Лимиты размера и типа применяются на эндпоинте, а защита от спама действует на всю отправку целиком, включая файлы.
В Formhook загрузка файлов доступна начиная с тарифа Pro, и - что важно для европейских сайтов - загруженные файлы хранятся в регионе ЕС Cloudflare R2, так что резюме, прикреплённое соискателем из ЕС, получает тот же ответ по резидентности данных, что и текстовые поля: оно никогда не покидает ЕС. (Подробности о хранении - в документации.)
Практические правила независимо от выбранного варианта
- Ограничьте ввод. Используйте атрибут
accept(accept=".pdf,.png,.jpg") как элемент UX, но относитесь к нему как к рекомендации - настоящая проверка происходит на эндпоинте. - Сообщайте пользователям лимит до того, как они в него упрутся. «Макс. 10 MB» рядом с полем лучше, чем ошибка после медленной загрузки.
- Файлы - это тоже персональные данные. Резюме, пожалуй, чувствительнее, чем поля формы вокруг него. Политики хранения, удаления и экспорта должны охватывать вложения, а утверждение о месте хранения в вашей политике конфиденциальности должно включать и их. (См. чек-лист GDPR.)
- Сохраните рабочим путь без JS. Обычная multipart-форма прекрасно отправляется вообще без скриптов; добавляйте AJAX-полировку поверх, а не вместо.
Паттерн для статических сайтов устоялся: сайт остаётся статическим, бэкенд форм принимает multipart POST, а файл оказывается рядом с сообщением, с которым он пришёл. Форма - по-прежнему один атрибут, плюс один enctype.
Рабочая форма в одну строку
Размещение в ЕС, отправки хранятся вечно, push-уведомления на любом тарифе.
Начать бесплатноБез банковской карты · читайте документацию
Читать дальше
- Что такое бэкенд форм? (И когда он вам нужен)Бэкенд форм принимает, хранит и пересылает отправки форм вашего сайта, чтобы вам не пришлось запускать сервер. Вот как это работает и когда он вам нужен.
- Формы обратной связи, соответствующие GDPR: практический чек-листЧто GDPR требует от формы обратной связи: правовое основание, место и сроки хранения, политика конфиденциальности. Чек-лист для разработчиков.
- Как добавить контактную форму на GitHub PagesGitHub Pages не выполняет серверный код, но контактную форму всё равно можно сделать. Сравниваем три подхода и даём решение на копипасте за одну минуту.