You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:无需OAuth认证,纯JS实现浏览器端Google Drive匿名上传

无OAuth认证的Google Drive公共上传方案(浏览器/PHP实现)

核心说明

直接在浏览器端使用服务账号密钥绝对不安全——密钥会暴露给所有用户,任何人都能滥用你的Drive权限。必须把服务账号逻辑放在后端(比如PHP),前端仅负责上传文件到后端,由后端完成Drive上传操作。


方案一:PHP后端 + 纯HTML/JS前端

1. 准备工作

  • 从Google Cloud控制台下载服务账号的JSON密钥,重命名为service-account-key.json,放在PHP项目目录(注意:绝不能暴露给前端)
  • 安装Google Drive PHP客户端:composer require google/apiclient:^2.0

2. 前端上传表单(HTML/JS)

<!DOCTYPE html>
<html>
<body>
  <h3>上传文件到Drive</h3>
  <input type="file" id="fileInput">
  <button onclick="uploadFile()">上传</button>
  <div id="status"></div>

  <script>
    async function uploadFile() {
      const file = document.getElementById('fileInput').files[0];
      if (!file) {
        document.getElementById('status').textContent = '请选择文件';
        return;
      }

      const formData = new FormData();
      formData.append('file', file);

      try {
        const response = await fetch('upload-to-drive.php', {
          method: 'POST',
          body: formData
        });
        const result = await response.json();
        if (result.success) {
          document.getElementById('status').textContent = `上传成功!文件ID:${result.fileId}`;
        } else {
          document.getElementById('status').textContent = `上传失败:${result.error}`;
        }
      } catch (err) {
        document.getElementById('status').textContent = '网络错误,请重试';
      }
    }
  </script>
</body>
</html>

3. PHP后端处理逻辑(upload-to-drive.php)

<?php
require __DIR__ . '/vendor/autoload.php';

// 检查文件上传状态
if (!isset($_FILES['file']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK) {
  echo json_encode(['success' => false, 'error' => '文件上传失败']);
  exit;
}

$filePath = $_FILES['file']['tmp_name'];
$fileName = $_FILES['file']['name'];

// 初始化Google客户端
$client = new Google\Client();
$client->setAuthConfig('service-account-key.json');
$client->addScope(Google\Service\Drive::DRIVE_FILE);
// 可选:若需上传到特定用户的Drive,需先让该用户共享文件夹给服务账号邮箱,再开启此行
// $client->setSubject('target-user@example.com');

$driveService = new Google\Service\Drive($client);

// 设置文件元数据
$fileMetadata = new Google\Service\Drive\File();
$fileMetadata->setName($fileName);
// 可选:指定上传到目标文件夹,替换为你的文件夹ID
// $fileMetadata->setParents(['YOUR_TARGET_FOLDER_ID']);

// 分片上传文件
$media = new Google\Service\Drive\MediaFileUpload(
  $client,
  $fileMetadata,
  $_FILES['file']['type'],
  file_get_contents($filePath),
  true,
  false
);

$media->setChunkSize(Google\Service\Drive\MediaFileUpload::DEFAULT_CHUNK_SIZE);

try {
  $response = $driveService->files->create($fileMetadata, [
    'media' => $media,
    'fields' => 'id'
  ]);
  echo json_encode(['success' => true, 'fileId' => $response->id]);
} catch (Exception $e) {
  echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}

关键注意事项

  • 服务账号权限配置:如果要上传到特定用户的Drive文件夹,需要该用户将目标文件夹共享给服务账号的邮箱(JSON密钥中的client_email字段),权限设为「编辑」
  • 安全防护:后端需添加文件大小、类型校验,防止恶意上传大文件或违规格式文件
  • 浏览器端限制:无法直接在浏览器使用服务账号密钥,必须通过后端中转,避免密钥泄露

内容的提问来源于stack exchange,提问作者Ameen Halawani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:10:36