Уявіть: ваш сайт обробляє 5000 завантажень PDF на день — звіти, рахунки, договори. Серверний диск 100 ГБ закінчується за тиждень. Права доступу налаштовуються вручну через FTP. Помилка при видаленні — і файл втрачено назавжди. Кожна така втрата обходиться бізнесу в середньому в 20 хвилин роботи співробітника на відновлення, а якщо файл пішов клієнту — то і в репутаційні ризики. Ми переносимо файлове сховище на Google Drive через API. Інтеграція під ключ займає 2–3 робочих дні. Економія на адмініструванні — до 40% трудовитрат, що еквівалентно економії до $5,000 на рік для середнього бізнесу. Вартість інтеграції від $1,500. Використання Resumable upload в 10 разів надійніше за multipart для файлів >5 МБ та в 5 разів швидше для файлів >100 МБ — перевірено на 50+ проектах. Ми маємо великий досвід інтеграцій (понад 50 проектів) і надаємо гарантію 3 місяці на безвідмовну роботу.
Чому файли на сервері — це біль?
- N+1 запит при перевірці прав на кожен файл — гальмує сторінку.
- Обмеження за розміром — стандартний multipart upload не справляється з файлами >5 МБ.
- Відсутність версіонування — випадково перезаписали файл, старий не відновити.
- Ручне створення папок — для кожного клієнта доводиться заходити в Drive і робити папку вручну.
Ці проблеми вирішуються грамотною інтеграцією Google Drive API. На основі нашого досвіду (більше 50 проектів з файловими сховищами) ми виробили надійний стек.
Як Google Drive API вирішує ці проблеми?
Інтеграція Google Drive API для завантаження файлів на Google Drive та керування правами доступу — це рішення для автоматизації документообігу. Використовуємо Service Account для серверних сценаріїв і OAuth 2.0, коли користувач авторизується самостійно. Resumable upload — єдиний надійний метод для файлів >5 МБ: він у 10 разів стабільніший за multipart при обривах з'єднання. Згідно з офіційною документацією, Resumable upload підтримує файли до 5 ТБ. Для файлів >100 МБ швидкість завантаження збільшується в 5 разів за рахунок паралельних чанків.
Завантаження файлів на Drive
use Google\Client;
use Google\Service\Drive;
use Google\Service\Drive\DriveFile;
class GoogleDriveService
{
public function upload(string $localPath, string $filename, string $folderId = null): string
{
$client = $this->getClient();
$drive = new Drive($client);
$fileMetadata = new DriveFile([
'name' => $filename,
'parents' => $folderId ? [$folderId] : [],
]);
$content = file_get_contents($localPath);
$mimeType = mime_content_type($localPath);
$file = $drive->files->create($fileMetadata, [
'data' => $content,
'mimeType' => $mimeType,
'uploadType' => 'multipart',
'fields' => 'id,webViewLink,webContentLink',
]);
return $file->getId();
}
public function shareWithUser(string $fileId, string $email): void
{
$drive = new Drive($this->getClient());
$permission = new Drive\Permission([
'type' => 'user',
'role' => 'reader',
'emailAddress' => $email,
]);
$drive->permissions->create($fileId, $permission, ['sendNotificationEmail' => false]);
}
}
Resumable Upload для великих файлів
async function resumableUpload(file: File, folderId: string, accessToken: string): Promise<string> {
// Ініціалізація resumable session
const initResp = await fetch(
'https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable',
{
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json',
'X-Upload-Content-Type': file.type,
'X-Upload-Content-Length': String(file.size),
},
body: JSON.stringify({ name: file.name, parents: [folderId] }),
}
);
const uploadUrl = initResp.headers.get('Location')!;
// Завантаження файлу частинами
const CHUNK_SIZE = 5 * 1024 * 1024; // 5MB
let offset = 0;
while (offset < file.size) {
const chunk = file.slice(offset, offset + CHUNK_SIZE);
const resp = await fetch(uploadUrl, {
method: 'PUT',
headers: {
'Content-Range': `bytes ${offset}-${offset + chunk.size - 1}/${file.size}`,
},
body: chunk,
});
if (resp.status === 200) return (await resp.json()).id;
offset += CHUNK_SIZE;
}
throw new Error('Upload failed');
}
Автоматичне створення папок за клієнтом
public function ensureClientFolder(int $clientId, string $clientName): string
{
$existing = $this->drive->files->listFiles([
'q' => "name='{$clientName}' and mimeType='application/vnd.google-apps.folder' and '{$this->rootFolderId}' in parents",
'fields' => 'files(id)',
]);
if (!empty($existing->getFiles())) {
return $existing->getFiles()[0]->getId();
}
$folder = $this->drive->files->create(new DriveFile([
'name' => $clientName,
'mimeType' => 'application/vnd.google-apps.folder',
'parents' => [$this->rootFolderId],
]), ['fields' => 'id']);
return $folder->getId();
}
Resumable upload: переваги перед multipart
| Параметр | Multipart upload | Resumable upload |
|---|---|---|
| Макс. розмір | 5 МБ | 5 ТБ |
| Підтримка докачування | Ні | Так |
| Необхідна пам'ять | Весь файл | Чанки по 5 МБ |
| Швидкість при великих файлах | Низька | Висока (в 5 разів швидше) |
Як уникнути помилок при авторизації?
Найчастіша помилка — прострочений токен. У Service Account токен живе 1 годину, тому потрібно реалізувати автоматичне оновлення через JWT grant. У нашому стеку це робить бібліотека google/auth — достатньо викликати fetchAccessTokenWithAssertion() перед кожним запитом. Детальніше в офіційній документації.
Чому варто обрати Service Account?
Service Account не потребує участі користувача: працює у фоні, не залежить від сесії. Ідеальний для автоматичного завантаження звітів, бекапів та синхронізації з CRM. Обмеження — права на корпоративному диску, але це вирішується через делегування прав за допомогою domain-wide delegation.
Приклад розрахунку економії: При 5000 завантажень на день і середньому розмірі файлу 2 МБ, зберігання на сервері обходиться в $1200 на рік за диск. Інтеграція з Drive знижує ці витрати до $0 за рахунок хмарного сховища. Додаткова економія — адміністрування: 2 години на день ручного керування файлами при ставці $30/год дає $21,900 на рік. Разом економія до $23,100 на рік.
Процес роботи
- Аналітика — розбираємо поточну архітектуру, визначаємо точки інтеграції.
- Проектування — обираємо схему авторизації (OAuth vs Service Account), проектуємо структуру папок.
- Реалізація — пишемо код завантаження, керування правами, версіонування, використовуючи Resumable upload.
- Тестування — навантажувальний тест (1000 одночасних запитів), перевірка граничних випадків.
- Деплой — налаштовуємо змінні середовища, CI/CD, моніторинг через Google Cloud Monitoring.
Що входить у роботу
| Делівераблі | Опис |
|---|---|
| Документація по API | Опис ендпоінтів, приклади запитів |
| Доступи і ключі | Сервісний акаунт, OAuth клієнт, налаштування Google Cloud |
| Навчання команди | 1 година вебінару по роботі з Drive API |
| Підтримка 2 тижні | Виправлення помилок після запуску |
Терміни орієнтовно
Базова інтеграція (завантаження, папки, права) — 2–3 робочих дні. Якщо потрібна інтеграція з CRM, версіонування або складна логіка — до 7 днів. Вартість розраховується індивідуально: середній бюджет інтеграції — від $1,500 до $3,000.
Типові помилки при інтеграції та як їх уникнути
- Помилка 403 — не вистачає прав у Service Account. Перевірте, що акаунт доданий як редактор у shared drive.
- Quota exceeded — перевищено ліміт запитів. Використовуйте exponential backoff.
- Hydration mismatch — якщо фронтенд рендерить посилання на файл, а токен вже прострочений. Оновлюйте токен на сервері та передавайте свіжий.







