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

使用Google Drive API从共享驱动器下载文件时遇404错误的解决方法

解决Google Drive API从共享驱动器下载文件返回404的问题

问题核心

调用Drive API访问共享驱动器内的文件时,必须显式传入supportsAllDrives=true参数——API默认仅检索「我的驱动器」内的资源,未加此参数会导致共享驱动器文件返回404。你的代码仅在非Google原生文件的下载请求中添加了该参数,但获取文件元数据、Google原生文件的导出请求都遗漏了这个关键参数,这是问题的根本原因。

修正后的完整代码

<?php
session_start(); // 必须启动会话才能使用$_SESSION存储令牌

require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';

$client = new Google_Client();

# Todo: 修改为你的客户端密钥路径
$client->setAuthConfig( __DIR__ . DIRECTORY_SEPARATOR . 'client_secret.json' );
$client->addScope( Google_Service_Drive::DRIVE );
$client->setAccessType( 'offline' );

$protocol   = ( ! empty( $_SERVER[ 'HTTPS' ] ) && $_SERVER[ 'HTTPS' ] !== 'off' || $_SERVER[ 'SERVER_PORT' ] == 443 ) ? "https://" : "http://";
$currentUrl = $protocol . $_SERVER[ 'HTTP_HOST' ] . $_SERVER[ 'PHP_SELF' ];

$client->setRedirectUri( $currentUrl );

if ( ! isset( $_GET[ 'code' ] ) ) {
    $auth_url = $client->createAuthUrl();
    header( 'Location: ' . filter_var( $auth_url, FILTER_SANITIZE_URL ) );
    exit;
}
else {
    $_SESSION[ 'access_token' ] = $client->fetchAccessTokenWithAuthCode( $_GET[ 'code' ] );
    $client->setAccessToken($_SESSION['access_token']); // 显式加载令牌,确保API调用生效

    $driveService   = new Google_Service_Drive( $client );
    
    # Todo: 修改为目标文件ID
    $google_file_id = 'YOUR_FILE_ID_HERE';

    try {
        // 获取元数据时必须添加supportsAllDrives参数
        $file_metadata = $driveService->files->get( $google_file_id, ['supportsAllDrives' => true] );
        $content = '';
        $file_name = '';

        if ( $file_metadata->getMimeType() && str_starts_with( $file_metadata->getMimeType(), 'application/vnd.google-apps.' ) ) {
            // 导出Google原生文件时同样需要该参数
            $response  = $driveService->files->export( $google_file_id, 'application/pdf', [ 
                'alt' => 'media',
                'supportsAllDrives' => true 
            ] );
            $file_name = $file_metadata->getName() . '.pdf';
        }
        else {
            $response  = $driveService->files->get( $google_file_id, [ 
                'alt' => 'media', 
                'supportsAllDrives' => true 
            ] );
            $file_name = $file_metadata->getName();
        }

        $content = $response->getBody()->getContents();
        file_put_contents( __DIR__ . DIRECTORY_SEPARATOR . $file_name, $content );

        echo "Stored!";

    }
    catch ( Exception $e ) {
        echo '<pre>';
        var_export( $e );
        echo '</pre>';
    }
}

关键修正点

  • 全局添加supportsAllDrives=true:在files.get(获取元数据)、files.export(导出原生文件)、files.get(下载非原生文件)三个核心请求中都加入该参数,确保API能检索共享驱动器资源。
  • 修复令牌加载逻辑:添加session_start()启动会话,显式调用$client->setAccessToken(),避免因令牌未正确加载导致的权限问题。
  • 调整下载流程:原代码提前执行了未加参数的下载请求,会先触发404错误;修正后先判断文件类型,再分支处理下载/导出,确保逻辑连贯。

额外验证项

  • 确认授权账号确实拥有目标共享驱动器文件的完全访问权限。
  • 检查Google Cloud控制台已启用Drive API,且OAuth客户端ID配置正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:47:31