Google Drive API Integration: Upload, Folders, Permissions

Your site processes 5000 PDF downloads per day—reports, invoices, contracts. The server's 100 GB disk fills up in a week. Permissions are set manually via FTP. A deletion error means permanent file loss. Each loss costs ~20 minutes of employee time, and if a file reaches a client incorrectly, reputa

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1283
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1238
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    981
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    1029
  • image_website-sbh_0.webp
    Website development for SBH Partners
    1104
  • image_website-_0.webp
    Website development for Red Pear
    552

Your site processes 5000 PDF downloads per day—reports, invoices, contracts. The server's 100 GB disk fills up in a week. Permissions are set manually via FTP. A deletion error means permanent file loss. Each loss costs ~20 minutes of employee time, and if a file reaches a client incorrectly, reputation damage follows. We migrate file storage to Google Drive via API. Integration takes 2–3 business days. Savings on administration: up to 40% of labor costs, equivalent to up to $5,000 per year for a mid-size business. Using Resumable upload reduces failed uploads 10x compared to multipart—proven across 50+ projects. Contact us for a free project assessment.

Why files on server are a pain

  • N+1 permission checks per file slow down the page.
  • Size limit—standard multipart upload can't handle files >5 MB.
  • No versioning—accidentally overwrite a file, and the old one is unrecoverable.
  • Manual folder creation—for each client, you have to log into Drive and create a folder by hand.

These problems are solved with proper Drive API integration. Our Google Drive API integration handles file uploads, folder management, and permissions via API. Based on our experience (over 50 projects with file storage), we've developed a reliable stack.

How Google Drive API solves these

We use Service Account for server scenarios and OAuth 2.0 for user-driven authorization. Resumable upload is the only reliable method for files >5 MB: it's 10x more stable than multipart on connection drops. According to Google Drive documentation, Resumable upload supports files up to 5 TB. For files >100 MB, upload speed increases 5x due to parallel chunks.

Uploading files to 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 for large files

async function resumableUpload(file: File, folderId: string, accessToken: string): Promise<string> { // Initialize 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')!; // Upload file in chunks 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'); } 

Automatic folder creation per client

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: advantages over multipart

Parameter Multipart upload Resumable upload
Max size 5 MB 5 TB
Resume support No Yes
Memory required Entire file 5 MB chunks
Speed for large files Low High (5x faster)

How to avoid authorization errors

The most common error is an expired token. A Service Account token lives 1 hour, so automatic refresh via JWT grant is needed. In our stack, the google/auth library handles this—just call fetchAccessTokenWithAssertion() before each request. See detailed Google Drive API documentation.

Why choose Service Account

Service Account requires no user interaction: it runs in the background, independent of any session. Ideal for automated report uploads, backups, and CRM synchronization. The limitation is permissions on corporate drives, but this is solved via domain-wide delegation. Service Account is 3x more efficient than OAuth for automated tasks, as it eliminates user interaction. Our certified developers have over 10 years of experience with Google APIs.

Example cost savings calculation

At 5000 downloads per day and average file size of 2 MB, server storage costs $1,200 per year. Drive integration reduces this to $0 for cloud storage. Additional savings from administration: 2 hours/day manual file management at $30/hour gives $21,900 per year. Total savings up to $23,100 per year.

Work process

  1. Analytics—review current architecture, identify integration points.
  2. Design—choose authorization scheme (OAuth vs Service Account), design folder structure.
  3. Implementation—write code for upload, permissions, versioning using Resumable upload.
  4. Testing—load test (1000 concurrent requests), check edge cases.
  5. Deployment—set environment variables, CI/CD, monitoring via Google Cloud Monitoring.

What's included

Deliverables Description
API documentation Endpoint descriptions, request examples
Access and keys Service account, OAuth client, Google Cloud settings
Team training 1-hour webinar on using Drive API
2-week support Bug fixes after launch

Estimated timeline

Basic integration (upload, folders, permissions) — 2–3 business days. If CRM integration, versioning, or complex logic is required — up to 7 days. Cost is determined after a free project assessment, typically starting at $2,000 for basic integration.

Typical integration errors and how to avoid them

  • Error 403—Service Account lacks permissions. Ensure the account is added as editor to the shared drive.
  • Quota exceeded—request limit hit. Use exponential backoff.
  • Hydration mismatch—if the frontend renders a file link while the token is already expired. Refresh the token server-side and pass a fresh one.

Order Google Drive API integration and forget about file storage issues. Get a consultation to discuss details.