使用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
相关产品推荐
相关产品推荐

