Интересный кейс реализовали на днях для постоянного клиента. Задача была двойная. С одной стороны, реализовать раздел "Мои документы" в личном кабинете заемщика, чтобы пользователи могли загружать изображения (сканы) документов необходимых для получения займа. С другой стороны, чтобы не хранить все это на сервере сайта надо организовать транспортировку файлов в облачное хранилище Google Drive и далее иметь возможность получать список того что было загружено.
Общая система загрузки
Начальная система загрузки и хранения
С первой частью особых вопросов не было. Сделать раздел и добавить в него форму загрузки файлов является стандартной процедурой, которую наши специалисты делают с особой легкостью. Единственное на что можно обратить внимание на данном шаге, это оформление и структура сохранения файлов.
Для начала мы под каждый документ вывели клиенту отдельное поле для выбора файла. С точки зрения юзабилити это удобнее и у пользователя не возникает лишних вопросов куда какой файл добавлять. Первоначальное хранение происходит в папке загрузки сайта, создавая для каждого клиента отдельный раздел. Названия файлов генерируются системой и имеют идентификационные ключи, таким образом мы легко через автоматические процессы можем определить где какой документ, чтобы ставить в кабинете пользователя отметки какие документы уже загружены.
Обмен с Google Drive через API
Загрузка списка файлов из папки Google Drive
Общий каркас обмена мы выстроили с помощью готовой официальной библиотеки google-api-php-client-2.4.0. Тут важно не перепутать момент с источником. Если вы используете Composer, инструкция по установке есть тут. А если вы загружаете полный архив релиза, то скачивать надо здесь.
Далее, когда у вас библиотека установлена и подключена, первое с чего мы начинаем это авторизуемся по токену, чтобы обмен был возможен. Тут чаще всего сталкиваются с вопросом - как сделать токен самообновляемым? Ведь он выпускается на ограниченное количество времени (на час обычно). И если не автоматизировать процесс его обновления, то пользователю будет выдаваться ошибка подключения и как следствие ни загрузка, ни получения файлов работать не будет.
Чтобы этой проблемы не было достаточно добавить следующие три строчки в блоке авторизации (чуть ниже покажем весь код):
Используя эту схему, мы получили токен один раз, чтобы связать сайт с нашим приложением, которое использует Google Drive API. Сам токен сохраняется в файле, а для дополнительной безопасности в приложении ограничиваются запросы только с домена сайта, а другие источники блокируются.
Идем далее, перед тем как загружать файлы, надо проверить не были ли они загружены ранее на облачный диск. Для этого мы делаем запрос на получение папки пользователя. Узнаем ее id в облаке и по нему уже получаем список хранимых в ней файлов. Сам список мы сохраняем в сессию, чтобы не запрашивать его при каждом обновлении страницы, а сбрасывать только при новой загрузке или при последующих входах пользователя. Вот кусок кода этого процесса:
Экспорт локальных файлов на внешнее хранилище
Теперь когда мы получили список имеющихся файлов, можно выводить форму и поля загрузки недостающих документов. После запуска процесса и сохранения файлов локально, делаем попытку отправить их в облако. Если не получится, то файлы не пропадут, ведь они у нас есть локально. А чтобы не мучить клиента попытками повторных попыток, мы откладываем передачу на другой скрипт, который выполняется по расписанию - проверяет наличие не отправленных файлов.
При сохранении мы так же проверяем сначала наличие папки пользователя на Google Drive. Если ее нет, то создаем и, используя полученный id в поле parents, сохраняем в нее файлы. По факту, процесс загрузки файлов сводится к тому, что в облаке сначала создается сам файл с нужным названием, а далее в него передается содержимое локального файла. Стоит так же быть внимательным с кодировкой, если у вас сайт в windows-1251, не забудьте конвертировать передаваемые данные в UTF-8.
Само сохранение в гугл, выглядит так:
Как видно по коду, после передачи файла в хранилище он удаляется из локальной папки и более не занимает место на хостинге сайта.
Резюме и вопросы по Google Drive API
Финальный скрипт получился такой:
Мы тут не описывали весь процесс создания приложения гугл, но можем ответить на наиболее часто возникающие вопросы.
С чего начать интеграцию с API Google Drive?
Используем для этого стандартную консоль разработчика гугл. Добавляем приложение и ставим в возможностях использование API нужного сервиса (гугл драйва).
Как первично получить токен (AccessToken) для дальнейшей синхронизации
Внутри библиотеки google-api-php-client-2.4.0, есть готовые пример для получения начального токена. При корректных настройках, о которых мы писали выше - setAccessType("offline") - получаем и сохраняем результат в файл для дальнейшего использования.